Share via


Joinfilter

Durch einen Joinfilter kann eine Tabelle auf der Grundlage der Filterkriterien einer verknüpften Tabelle in der Veröffentlichung gefiltert werden. In der Regel wird eine übergeordnete Tabelle mithilfe eines parametrisierten Filters gefiltert. Anschließend werden ein oder mehrere Joinfilter auf dieselbe Weise definiert, wie Sie einen Join zwischen Tabellen definieren. Die Joinfilter erweitern den parametrisierten Filter so, dass die Daten in den zugehörigen Tabellen nur dann repliziert werden, wenn sie der Joinfilterklausel entsprechen.

Joinfilter folgen in der Regel den für die Tabellen definierten Primärschlüssel/Fremdschlüssel (PRIMARY KEY/FOREIGN KEY)-Beziehungen, auf die sie angewendet werden, sie sind jedoch nicht strikt auf Primärschlüssel/Fremdschlüssel-Beziehungen beschränkt. Joinfilter können auf jeder Logik basieren, die miteinander in Beziehung stehende Daten in zwei Tabellen vergleicht.

Nehmen wir als Beispiel die folgenden Tabellen in der Adventure Works-Beispieldatenbank, die durch eine Primärschlüssel/Fremdschlüssel-Beziehung miteinander verbunden sind:

  • HumanResources.Employee

  • Sales.SalesOrderHeader

  • Sales.SalesOrderDetail

Diese Tabellen könnten in einer Anwendung zur Unterstützung mobiler Außendienstmitarbeiter verwendet werden, müssen dabei aber gefiltert werden, damit jeder Mitarbeiter in der HumanResources.Employee-Tabelle nur die für die Aufträge seiner Kunden relevanten Daten erhält.

Dafür muss als Erstes ein parametrisierter Filter für die übergeordnete Tabelle definiert werden. In diesem Beispiel ist dies die HumanResources.Employee-Tabelle. Diese Tabelle enthält die Spalte LoginID, in der Sie den Anmeldenamen für jeden Mitarbeiter in der Form domain\login finden. Wenn Sie diese Tabelle so filtern möchten, dass jeder Mitarbeiter nur die Daten erhält, die für ihn relevant sind, geben Sie folgende parametrisierte Filterklausel an:

LoginID = SUSER_SNAME()

Dieser Filter stellt sicher, dass das Abonnement des jeweiligen Mitarbeiters nur die Daten aus der HumanResources.Employee-Tabelle enthält, die für ihn relevant sind (in diesem Fall also nur eine einzelne Zeile). Weitere Informationen finden Sie unter Parametrisierte Zeilenfilter.

Als Nächstes wird dieser Filter auf jede einzelne der zugehörigen Tabellen erweitert. Die dazu verwendete Syntax ähnelt derjenigen, mit der Sie einen Join zwischen zwei Tabellen angeben können. Die erste Joinfilterklausel lautet:

Employee.EmployeeID = SalesOrderHeader.SalesPersonID

Diese Klausel stellt sicher, dass das Abonnement nur die Auftragsdaten enthält, die für den betreffenden Außendienstmitarbeiter relevant sind. Die zweite Joinfilterklausel lautet:

SalesOrderHeader.SalesOrderID = SalesOrderDetail.SalesOrderID

Diese Klausel stellt sicher, dass das Abonnement nur die den Auftragsdaten zugehörigen Detaildaten des betreffenden Außendienstmitarbeiters enthält. Dieses Beispiel zeigt eine Einzeltabelle, die an jedem Punkt verknüpft ist. Es ist aber auch möglich, an jedem Punkt mehrere Tabellen zu verknüpfen.

Joinfilter können jeweils einzeln im Assistenten für neue Veröffentlichung und im Dialogfeld Veröffentlichungseigenschaften oder aber programmgesteuert hinzugefügt werden. Außerdem können Joinfilter über den Assistenten für neue Veröffentlichung automatisch generiert werden: Geben Sie dazu einen Zeilenfilter für eine Tabelle an, und die Joinfilter werden auf alle entsprechenden Tabellen angewendet. Weitere Informationen finden Sie unter Definieren und Ändern eines Verknüpfungsfilters zwischen Mergeartikeln, Automatisches Generieren einer Reihe von Joinfiltern zwischen Mergeartikeln (SQL Server Management Studio) und Definieren eines Artikels.

Optimieren der Joinfilterleistung

Zur Optimierung der Leistung der Joinfilter sollten Sie die folgenden Hinweise beachten:

  • Begrenzen Sie die Anzahl der Tabellen in der Joinfilterhierarchie.

    Joinfilter können zwar eine unbegrenzte Anzahl von Tabellen enthalten, Filter mit einer großen Tabellenanzahl wirken sich aber möglicherweise deutlich negativ auf die Leistung bei der Mergeverarbeitung aus. Wenn Sie Joinfilter mit fünf oder mehr Tabellen generieren, sollten Sie über andere Lösungen nachdenken: Filtern Sie keine Tabellen, die klein sind, die nicht geändert werden oder bei denen es sich in erster Linie um Nachschlagetabellen handelt. Verwenden Sie Joinfilter nur zwischen Tabellen, die auf Abonnements aufgeteilt (partitioniert) werden müssen.

  • Legen Sie, sofern zutreffend, für join unique key den Wert True fest.

    Im Mergeprozess sind besondere Leistungsoptimierungsmöglichkeiten verfügbar, wenn die verknüpfte Spalte in der übergeordneten Tabelle eindeutig ist. Wenn die Joinbedingung auf einer eindeutigen Spalte basiert, aktivieren Sie die Option join unique key für den Joinfilter. Informationen zum Festlegen dieser Option finden Sie in den im vorhergehenden Abschnitt genannten Vorgehensweise-Themen.

  • Stellen Sie sicher, dass die Spalten, auf die in den Joinfiltern verwiesen wird, indiziert sind.

    Wenn die Spalten, auf die im Filter verwiesen wird, indiziert sind, kann die Replikation die Filter effizienter verarbeiten.

  • Erstellen Sie keine Zeilenfilter, die sich wie Joinfilter verhalten.

    Mithilfe einer Unterabfrage in einer WHERE-Klausel ist es möglich, Zeilenfilter zu erstellen, die sich wie Joinfilter verhalten:

    WHERE Customer.SalesPersonID IN (SELECT EmployeeID FROM Employee WHERE LoginID = SUSER_SNAME()) 
    

    Es wird dringend empfohlen, eine solche Logik statt in einer Unterabfrage in einem Joinfilter auszudrücken. Wenn Ihre Anwendung für die Verwendung einer Unterabfrage einen Zeilenfilter benötigt, stellen Sie sicher, dass die Unterabfrage ausschließlich Daten in der Nachschlagetabelle referenziert, die sich nicht ändern.

Siehe auch

Konzepte

Filtern veröffentlichter Daten für die Mergereplikation

Parametrisierte Zeilenfilter