Funktionsweise beim Bewerten von Partitionen in gefilterten Publikationen durch die Mergereplikation

Wenn eine oder mehrere Tabellen in einer Mergereplikation mithilfe parametrisierter Filter oder Verknüpfungsfilter gefiltert werden, werden die Daten in den veröffentlichten Tabellen partitioniert. Bei einer Partition handelt es sich um eine Teilmenge der Zeilen einer Tabelle. Wenn ein Abonnent die Synchronisierung mit einem Verleger vornimmt, muss der Verleger ermitteln, welche Zeilen der Partition eines Abonnenten zugehörig sind, und zwar basierend auf den Werten, die vom Abonnenten für die Systemfunktionen SUSER_SNAME() und/oder HOST_NAME() angegeben werden. Diese Ermittlung der Partitionsmitgliedschaft von Änderungen auf dem Verleger für jeden Abonnenten, der ein gefiltertes Dataset erhält, wird als Partitionsbewertung bezeichnet.

Abhängig von den Daten in veröffentlichten Tabellen und den Einstellungen, die bei der Erstellung eines parametrisierten Filters und sämtlicher zugehöriger Verknüpfungsfilter ausgewählt wurden, trifft Folgendes für jede Zeile in einer veröffentlichten Tabelle zu:

  • Sie kann einer Partition zugehörig sein und nur auf einem Abonnenten repliziert werden (Wert 3 für den sp_addmergearticle-Parameter @partition_options). So können Sie beispielsweise in der AdventureWorks-Datenbank die Employee-Tabelle mit folgender Filterklausel filtern: WHERE Employee.LoginID = SUSER_SNAME(). Die Zeile, die der jeweiligen Anmelde-ID entspricht, wird an nur einen Abonnenten gesendet.
  • Sie kann einer Partition zugehörig sein und auf mehreren Abonnenten repliziert werden (Wert 2 für @partition_options). So können Sie beispielsweise in der AdventureWorks-Datenbank die Products-Tabelle mit folgender Filterklausel filtern: WHERE Products.ProductLine = HOST_NAME(). Der Wert HOST_NAME() wird außer Kraft gesetzt, sodass die Vertriebsmitarbeiter, die für den Verkauf von Mountain-Bikes zuständig sind, alle Zeilen mit dem Wert "M" in der ProductLine-Spalte erhalten. Eine Zeile mit dem Wert "M" ist nur jeweils einer Partition zughörig, wird jedoch an mehrere Abonnenten gesendet. Weitere Informationen zum Verwenden von HOST_NAME() finden Sie im Abschnitt zum Filtern mit HOST_NAME() unter Parametrisierte Zeilenfilter.
  • Sie kann mehreren Partitionen zugehörig sein und auf mehreren Abonnenten repliziert werden (Wert 0 oder 1 für @partition_options). So können Sie beispielsweise in der AdventureWorks-Datenbank die Products-Tabelle mit folgender Filterklausel filtern: WHERE Products.ProductLine = HOST_NAME() or Products.ListPrice < 100. In diesem Fall dürfen Vertriebsmitarbeiter, die für den Verkauf von Mountain-Bikes zuständig sind, auch Produkte anderer Kategorien verkaufen, solange der Verkaufspreis unter 100 Dollar liegt. Aufgrund des OR-Operators in der Filterklausel kann die Zeile mehreren Partitionen zugehörig sein.

So werden Partitionen bewertet

Die Partitionsbewertung kann bei der Mergereplikation auf zweierlei Art vorgenommen werden, abhängig davon, ob das Feature für vorausberechnete Partitionen verwendet wird. Wenn eine Reihe von Anforderungen erfüllt ist, ist bei der Erstellung neuer Mergepublikationen standardmäßig das Feature für vorausberechnete Partitionen aktiviert, und bestehende Publikationen werden automatisch für die Verwendung dieses Features aktualisiert. Die vollständige Liste der Anforderungen finden Sie unter Optimieren der Leistung parametrisierter Filter mithilfe vorausberechneter Partitionen.

Partitionsbewertung mit vorausberechneten Partitionen

Wenn das Feature für vorausberechnete Partitionen verwendet wird, wird die Mitgliedschaft für sämtliche Änderungen auf dem Verleger vorausberechnet und beibehalten, wenn Änderungen an veröffentlichten Tabellen vorgenommen werden. Daraus ergibt sich Folgendes: Wenn ein Abonnent den Synchronisierungsvorgang mit dem Verleger ausführt, kann unmittelbar mit dem Download von Änderungen begonnen werden, die für die jeweilige Partition relevant sind, ohne zunächst die Partitionsbewertung durchlaufen zu müssen. Wenn eine Publikation eine große Anzahl an Änderungen, Abonnenten oder Artikeln aufweist, kann dies zu deutlichen Leistungssteigerungen führen.

Folgende Systemtabellen sind in die Bewertung vorausberechneter Partitionen involviert:

  • MSmerge_partition_groups
  • MSmerge_current_partition_mappings
  • MSmerge_past_partition_mappings

MSmerge_partition_groups enthält eine Zeile für jede Partition, die in einer Publikation definiert ist. Auf Partitionen kann Folgendes zutreffen:

  • Sie können im Dialogfeld mit den Publikationseigenschaften über die Seite sp_addmergepartition oder Data Partitions explizit definiert werden.
  • Sie können bei der Synchronisierung eines Abonnenten automatisch erstellt werden, wenn für den Abonnenten eine Partition erforderlich ist, die für MSmerge_partition_groups noch keinen Eintrag enthält.

Die beiden anderen Tabellen (MSmerge_current_partition_mappings und MSmerge_past_partition_mappings) werden aufgefüllt, wenn Änderungen an veröffentlichten Tabellen vorgenommen werden. Bei jeder Änderung einer veröffentlichten Tabelle in der Publikationsdatenbank werden Metadaten durch einen Mergetrigger ausgegeben und aufgezeichnet:

  • MSmerge_current_partition_mappings enthält für jede eindeutige Kombination von Zeilen in MSmerge_contents und MSmerge_partition_groups eine Zeile. Wenn beispielsweise eine Zeile in einer Benutzertabelle zwei Partitionen zugehörig ist und diese Zeile aktualisiert wird, wird eine Zeile in MSmerge_contents eingefügt, um die Aktualisierung widerzuspiegeln, und zwei Zeilen werden in MSmerge_current_partition_mappings eingefügt, um anzugeben, dass die aktualisierte Zeile den beiden Partitionen zugehörig ist.
  • MSmerge_past_partition_mappings enthält eine Zeile für jede Zeile, die keiner bestimmten Partition mehr zugehörig ist. In folgenden Fällen wird eine Zeile aus einer Partition verschoben:
    • Die Zeile wird gelöscht. Wenn eine Zeile aus einer Benutzertabelle gelöscht wird, wird eine Zeile in MSmerge_tombstone eingefügt, und eine oder mehrere Zeilen werden in MSmerge_past_partition_mappings eingefügt.
    • Der Wert in einer Spalte, die zum Filtern verwendet wird, hat sich geändert. Wenn beispielsweise ein parametrisierter Filter auf dem Bundesland basiert, in dem sich der Hauptsitz eines Unternehmens befindet, und das Unternehmen umzieht, werden die Zeile für das Unternehmen (und die zugehörigen Zeilen in anderen Tabellen) möglicherweise aus der Datenpartition eines Vertriebsmitarbeiters in die Partition eines anderen Vertriebsmitarbeiters verschoben. Wenn eine Zeile dahin gehend aktualisiert wird, dass sie keiner Partition mehr zugehörig ist, wird eine Zeile in MSmerge_contents eingefügt oder aktualisiert, und eine oder mehrere Zeilen werden in MSmerge_past_partition_mappings eingefügt.
    ms151226.note(de-de,SQL.90).gifHinweis:
    Bei der Verwendung nicht überlappender Partitionen mit einem Abonnement pro Partition (Wert 3 für den sp_addmergearticle-Parameter @partition_options) werden die Systemtabellen MSmerge_current_partition_mappings und MSmerge_past_partition_mappings nicht zur Nachverfolgung der Partitionszuordnungen der Zeilen verwendet, da jede Zeile nur einer Partition zugehörig ist und nur auf einem einzigen Abonnenten geändert werden kann.

Partitionsbewertung mit SetupBelongs-Prozess

Wenn keine vorausberechneten Partitionen verfügbar sind, wird ein als SetupBelongs bezeichneter Prozess verwendet. Bei der Synchronisierung erfolgt die Partitionsbewertung für jede Änderung, die auf dem Verleger an einer gefilterten Tabelle ausgeführt wurde, seit der Merge-Agent zuletzt für einen bestimmten Abonnenten ausgeführt wurde. Dieser Prozess wird für sämtliche Abonnenten wiederholt, die den Synchronisierungsvorgang mit dem Verleger ausführen.

Um die Partitionsbewertung für einen Abonnenten auszuführen, ruft der Merge-Agent die gespeicherte sp_MSsetupbelongs-Systemprozedur auf, die wie folgt vorgeht:

  1. Sie erstellt zwei temporäre Tabellen für jeden gefilterten Artikel: #belongs_<RandomNumber> und #notbelongs_<RandomNumber>.
  2. Sie verwendet den von den Funktionen SUSER_SNAME() und/oder HOST_NAME() zurückgegebenen Wert, um eine Systemsicht abzufragen; anhand der Abfrage wird ermittelt, ob eine Zeile in MSmerge_contents oder MSmerge_tombstone für die Partition des Abonnenten relevant ist.
  3. Wenn die Zeile für den Abonnenten keinerlei Relevanz aufweist (weil es sich z. B. um eine Einfügung für eine andere Partition handelt), werden Metadaten für diese Zeile nicht in #belongs oder #notbelongs gespeichert. Wenn die Zeile relevant ist, sind zwei Ergebnisse möglich:
    • In folgenden Fällen wird #belongs eine Zeile hinzugefügt: Bei der Zeile in MSmerge_contents handelt es sich um eine Einfügung, die der Partition zugehörig ist, oder bei der Zeile in MSmerge_contents handelt es sich um eine Aktualisierung, durch die keine Werte in den für die Filterung verwendeten Spalten geändert werden.
    • In folgenden Fällen wird #notbelongs eine Zeile hinzugefügt: Bei der Zeile in MSmerge_contents handelt es sich um eine Aktualisierung, von der ein Wert in den für die Filterung verwendeten Spalten verändert wird (die Zeile also in eine neue Partition verschoben wird), oder die Zeile in MSmerge_tombstone steht für das Löschen einer Zeile in der Partition.
ms151226.note(de-de,SQL.90).gifHinweis:
Auch bei der Aktivierung vorausberechneter Partitionen wird der SetupBelongs-Prozess bei der ersten Synchronisierung eines Abonnements verwendet, wenn das Abonnement erstellt wird, nachdem an anderen Abonnements bereits Änderungen vorgenommen wurden.

Siehe auch

Konzepte

Funktionsweise der Mergereplikation
Verknüpfungsfilter
Parametrisierte Zeilenfilter

Andere Ressourcen

MSmerge_contents (Transact-SQL)
MSmerge_current_partition_mappings
MSmerge_generation_partition_mappings (Transact-SQL)
MSmerge_genhistory (Transact-SQL)
MSmerge_partition_groups (Transact-SQL)
MSmerge_past_partition_mappings (Transact-SQL)
MSmerge_tombstone (Transact-SQL)
sp_addmergearticle (Transact-SQL)
sp_addmergepartition (Transact-SQL)
sysmergearticles (Transact-SQL)
sysmergesubscriptions (Transact-SQL)

Hilfe und Informationen

Informationsquellen für SQL Server 2005