Hur sammanslagningsreplikering utvärderar partitioner i filtrerade publikationer

När en eller flera tabeller i en sammanslagningspublikation filtreras med hjälp av parametriserade filter och kopplingsfilter partitioneras data i de publicerade tabellerna. En partition är helt enkelt en delmängd av raderna i en tabell. När en prenumerant synkroniseras med en Utgivare måste utgivaren avgöra vilka rader som tillhör en prenumerants partition baserat på värdena som Prenumerant tillhandahåller för systemfunktionerna SUSER_SNAME() och/eller HOST_NAME(). Den här processen för att fastställa partitionsmedlemskap för ändringar i Publisher för varje prenumerant som tar emot en filtrerad datauppsättning kallas partitionsutvärdering.

Beroende på data i publicerade tabeller och de inställningar som väljs när du skapar ett parameteriserat filter och eventuella relaterade kopplingsfilter kan varje rad i en publicerad tabell:

  • Tillhör en partition och replikeras till endast en Prenumerant (ett värde av 3 för parametern sp_addmergearticle@partition_options). I databasen AdventureWorks2025 kan du till exempel filtrera Employee-tabellen med följande filtersats: WHERE Employee.LoginID = SUSER_SNAME(). Raden som matchar varje inloggnings-ID skickas endast till en prenumerant.

  • Tillhör en partition och replikeras till mer än en abonnent (värdet 2 för @partition_options). I databasen AdventureWorks2025 kan du till exempel filtrera Products-tabellen med följande filtersats: WHERE Products.ProductLine = HOST_NAME(). Värdet HOST_NAME() åsidosätts så att gruppen med säljare som ansvarar för mountainbikeförsäljning tar emot alla rader med värdet "M" i ProductLine kolumnen. Varje rad med värdet "M" tillhör bara en partition, men skickas till mer än en prenumerant. Mer information om hur du använder HOST_NAME() finns i Filtrera med HOST_NAME().

  • Tillhör mer än en partition och replikeras till mer än en Prenumerant (ett värde på 0 eller 1 för @partition_options). I databasen AdventureWorks2025 kan du till exempel filtrera Products-tabellen med följande filtersats: WHERE Products.ProductLine = HOST_NAME() OR Products.ListPrice < 100. I det här fallet kan säljare som ansvarar för mountainbikeförsäljning också sälja produkter i andra kategorier så länge försäljningspriset är mindre än $ 100 dollar. På grund av OR i filtersatsen kan raden tillhöra mer än en partition.

Hur partitioner utvärderas

Partitionsutvärdering sker på ett av två sätt vid sammanslagningsreplikering, beroende på om funktionen för förberäknade partitioner används. Om flera krav uppfylls skapas nya sammanslagningspublikationer som standard med förberäknade partitioner aktiverade och befintliga publikationer uppgraderas automatiskt för att använda funktionen. En fullständig lista över krav finns i Parameteriserade filter – Optimera för förberäknade partitioner.

Partitionsutvärdering med förberäknade partitioner

Med förberäknade partitioner är partitionsmedlemskap för alla ändringar i Publisher förberäknat och behålls vid den tidpunkt då ändringar görs i publicerade tabeller. När en prenumerant synkroniseras med utgivaren kan den därför omedelbart börja ladda ned ändringar som är relevanta för partitionen utan att behöva gå igenom partitionsutvärderingsprocessen. Detta kan leda till betydande prestandavinster när en publikation har ett stort antal ändringar, prenumeranter eller artiklar i publikationen.

Systemtabellerna som ingår i förberäknad partitionsutvärdering är:

  • MSmerge_partition_groups
  • MSmerge_current_partition_mappings
  • MSmerge_past_partition_mappings

MSmerge_partition_groups innehåller en rad för varje partition som definieras i en publikation. Partitioner kan vara:

  • Definieras explicit med hjälp av sp_addmergepartition eller sidan Data Partitions i dialogrutan Publikationsegenskaper.

  • Skapas automatiskt när en prenumerant synkroniseras om prenumeranten kräver en partition som ännu inte har en post i MSmerge_partition_groups.

De andra två tabellerna (MSmerge_current_partition_mappings och MSmerge_past_partition_mappings) fylls i när ändringar görs i publicerade tabeller. Varje gång en ändring görs i en publicerad tabell i publikationsdatabasen utlöses en sammanslagningsutlösare och registrerar metadata:

  • MSmerge_current_partition_mappings innehåller en rad för varje unik kombination av rader i MSmerge_contents och MSmerge_partition_groups. Om till exempel en rad i en användartabell tillhör två partitioner och raden uppdateras infogas en rad i MSmerge_contents för att återspegla uppdateringen och två rader infogas i MSmerge_current_partition_mappingsför att indikera att den uppdaterade raden tillhör de två partitionerna.

  • MSmerge_past_partition_mappings innehåller en rad för varje rad som inte längre hör hemma i en viss partition. En rad flyttas från en partition om:

    • Raden tas bort. Om en rad tas bort från en användartabell infogas en rad i MSmerge_tombstone och en eller flera rader infogas i MSmerge_past_partition_mappings.

    • Värdet i en kolumn som används för filtrering har ändrats. Om till exempel ett parameteriserat filter baseras på tillståndet där ett företag har sitt huvudkontor och företaget flyttas, kan raden för företaget (och relaterade rader i andra tabeller) flytta ut från en säljares partition av data till partitionen för en annan säljare. Om en rad uppdateras så att den inte längre hör hemma i en partition infogas eller uppdateras en rad i MSmerge_contents och en eller flera rader infogas i MSmerge_past_partition_mappings.

      Anmärkning

      Om icke-överlappande partitioner med en prenumeration per partition (värdet 3 för för parametern sp_addmergearticle@partition_options ) används, används systemtabellerna MSmerge_current_partition_mappings och MSmerge_past_partition_mappings används inte för att spåra radernas partitionsmappningar, eftersom varje rad bara tillhör en partition och bara kan ändras med en Prenumerant.

Partitionsutvärdering med setupBelongs-processen

Utan förberäknade partitioner används en process som kallas SetupBelongs. Under synkroniseringen utförs partitionsutvärdering för varje ändring som görs i en filtrerad tabell i Publisher sedan den senaste gången sammanslagningsagenten kördes för en specifik prenumerant. Den här processen upprepas för varje prenumerant som synkroniseras med utgivaren.

För att utföra partitionsutvärdering för en prenumerant anropar sammanslagningsagenten den system lagrade proceduren sp_MSsetupbelongs, som:

  1. Skapar två temporära tabeller för varje filtrerad artikel: #belongs_<RandomNumber> och #notbelongs_<RandomNumber>.

  2. Använder värdet som returneras av SUSER_SNAME() funktionerna och/eller HOST_NAME() i Prenumeranten för att köra frågor mot en systemvy. Frågan används för att avgöra om en rad i MSmerge_contents eller MSmerge_tombstone är relevant för prenumerantens partition.

  3. Om raden inte alls är relevant för Prenumeranten (till exempel en infogning för en annan partition) lagras inte metadata för den här raden i #belongs eller #notbelongs. Om raden är relevant finns det två möjliga resultat:

    • En rad läggs till #belongs i om: raden i MSmerge_contents är en infogning som tillhör partitionen, eller raden i MSmerge_contents är en uppdatering som inte ändrar värden i kolumner som används för filtrering.

    • En rad läggs till #notbelongs i om: raden i MSmerge_contents är en uppdatering som ändrar ett värde i en kolumn som används för filtrering (med andra ord flyttar den raden till en ny partition) eller raden i MSmerge_tombstone representerar borttagningen av en rad i partitionen.

Anmärkning

Även om förberäknade partitioner är aktiverade används SetupBelongs-processen första gången en prenumeration synkroniseras om prenumerationen skapas efter att andra prenumerationer har börjat ta emot ändringar.