VerknüpfungsfilterJoin Filters

GILT FÜR: jaSQL Server neinAzure SQL-DatenbankneinAzure SQL Data Warehouse neinParallel Data WarehouseAPPLIES TO: yesSQL Server noAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Durch einen Joinfilter kann eine Tabelle auf der Grundlage der Filterkriterien einer verknüpften Tabelle in der Veröffentlichung gefiltert werden.A join filter allows a table to be filtered based on how a related table in the publication is filtered. 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.Typically a parent table is filtered using a parameterized filter; then one or more join filters are defined in much the same way that you define a join between tables. Die Joinfilter erweitern den parametrisierten Filter so, dass die Daten in den zugehörigen Tabellen nur dann repliziert werden, wenn sie der Joinfilterklausel entsprechen.The join filters extend the parameterized filter so that the data in the related tables is only replicated if it matches the join filter clause.

Joinfilter folgen normalerweise den Beziehungen zwischen Primär- und Fremdschlüssel, die für die Tabellen, auf die sie angewendet werden, definiert wurden. Sie sind jedoch nicht streng auf diese Primär-/Fremdschlüssel-Beziehungen festgelegt.Join filters typically follow the primary key/foreign key relationships defined for the tables to which they are applied, but they are not limited strictly to primary key/foreign key relationships. Joinfilter können auf jeder Logik basieren, die miteinander in Beziehung stehende Daten in zwei Tabellen vergleicht.The join filter can be based on any logic that compares related data in two tables.

Nehmen wir als Beispiel die folgenden Tabellen in der Adventure WorksAdventure Works -Beispieldatenbank, die durch eine Primärschlüssel/Fremdschlüssel-Beziehung miteinander verbunden sind:Consider the following tables in the Adventure WorksAdventure Works sample database, which are related through primary key to foreign key relationships:

  • HumanResources.EmployeeHumanResources.Employee

  • Sales.SalesOrderHeaderSales.SalesOrderHeader

  • Sales.SalesOrderDetailSales.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.These tables could be used in an application to support a mobile sales force, but they must be filtered so that each sales person in the HumanResources.Employee table receives only the data relevant to their customers' orders.

Dafür muss als Erstes ein parametrisierter Filter für die übergeordnete Tabelle definiert werden. In diesem Beispiel ist dies die HumanResources.Employee -Tabelle.The first step is to define a parameterized filter on the parent table, which in this example is the HumanResources.Employee table. Diese Tabelle enthält die LoginID-Spalte, in der Sie die Domäne und den Anmeldenamen (Anmelde-ID) für jeden Mitarbeiter in der Form domain\loginfinden.This table includes the column LoginID, which contains the login for each employee in the form domain\login. 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:To filter this table so that each employee receives only the data related to them, specify a parameterized filter clause of:

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).This filter ensures that each employee's subscription only contains data from the HumanResources.Employee table that is relevant to that employee (which in this case is a single row). Weitere Informationen finden Sie unter Parameterized Row Filters.For more information, see Parameterized Row Filters.

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.The next step is to extend this filter to each of the related tables, using syntax similar to that used to specify a join between two tables. Die erste Joinfilterklausel lautet:The first join filter clause is:

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.This ensures the subscription contains only the order data relevant to each sales person. Die zweite Joinfilterklausel lautet:The second join filter clause is:

SalesOrderHeader.SalesOrderID = SalesOrderDetail.SalesOrderID  

Diese Klausel stellt sicher, dass das Abonnement nur die den Auftragsdaten zugehörigen Detaildaten des betreffenden Außendienstmitarbeiters enthält.This ensures the subscription contains only the detail data related to the order data for each sales person. 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.This example shows a single table being joined at each point; it is also possible to join more than one table at each point.

Joinfilter können jeweils einzeln im Assistenten für neue Veröffentlichung und im Dialogfeld Veröffentlichungseigenschaften oder aber programmgesteuert hinzugefügt werden.Join filters can be added one at a time through the New Publication Wizard and the Publication Properties dialog box, or they can be added programmatically. 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.They can also be generated automatically through the New Publication Wizard: you specify a row filter for a table and join filters are applied to all related tables. Weitere Informationen finden Sie unter Definieren und Ändern eines Verknüpfungsfilters zwischen Mergeartikeln, Automatically Generate a Set of Join Filters Between Merge Articles (SQL Server Management Studio) (Automatische Generierung eines Satzes von Verknüpfungsfiltern zwischen Mergeartikeln (SQL Server Management Studio)) und Define an Article (Definieren eines Artikels).For more information, see Define and Modify a Join Filter Between Merge Articles, Automatically Generate a Set of Join Filters Between Merge Articles (SQL Server Management Studio), and Define an Article.

Optimieren der JoinfilterleistungOptimizing Join Filter Performance

Zur Optimierung der Leistung der Joinfilter sollten Sie die folgenden Hinweise beachten:Join filter performance can be optimized by following these guidelines:

  • Begrenzen Sie die Anzahl der Tabellen in der Joinsfilterhierarchie.Limit the number of tables in the join filter hierarchy.

    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.Join Filters can involve an unlimited number of tables, but filters with a large number of tables can significantly impact performance during merge processing. Wenn Sie Joinsfilter für fünf oder mehr Tabellen erstellen, sollten Sie andere Lösungen in Betracht ziehen: Kleinere Tabellen, Tabellen, die nicht geändert werden, oder Tabellen, bei denen es sich primär um Nachschlagetabellen handelt, sollten in diesem Fall nicht gefiltert werden.If you are generating join filters of five or more tables, consider other solutions: do not filter tables that are small, not subject to change, or are primarily lookup tables. Verwenden Sie Joinsfilter nur zwischen Tabellen, für die eine Partitionierung auf Abonnements erfolgen muss.Use join filters only between tables that must be partitioned among subscriptions.

  • Legen Sie, sofern zutreffend, für join unique key den Wert True fest.Set the join unique key option to True where appropriate.

    Im Mergeprozess sind besondere Leistungsoptimierungsmöglichkeiten verfügbar, wenn die verknüpfte Spalte in der übergeordneten Tabelle eindeutig ist.The merge process has special performance optimizations available if the joined column in the parent is unique. Wenn die Joinbedingung auf einer eindeutigen Spalte basiert, aktivieren Sie die Option join unique key für den Joinfilter.If the join condition is based on a unique column, set the join unique key option for the join filter. Informationen zum Festlegen dieser Option finden Sie in den im vorhergehenden Abschnitt genannten Vorgehensweise-Themen.For information about setting this option, see the how-to topics listed in the previous section.

  • Stellen Sie sicher, dass die Spalten, auf die in den Joinfiltern verwiesen wird, indiziert sind.Ensure that the columns referenced in join filters are indexed.

    Wenn die Spalten, auf die im Filter verwiesen wird, indiziert sind, kann die Replikation die Filter effizienter verarbeiten.If the columns referenced in the filter are indexed, replication can process the filters more efficiently.

  • Erstellen Sie keine Zeilenfilter, die sich wie Joinfilter verhalten.Do not create row filters that mimic join filters.

    Mithilfe einer Unterabfrage in einer WHERE-Klausel ist es möglich, Zeilenfilter zu erstellen, die sich wie Joinfilter verhalten:It is possible to create row filters that mimic join filters by using a subquery in a WHERE clause, such as:

    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.It is strongly recommended that all such logic be expressed in a join filter rather than a subquery. 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.If your application requires a row filter to use a subsquery, ensure that the subquery only references lookup data that does not change.

Weitere InformationenSee Also

Filtern veröffentlichter Daten für die Mergereplikation Filter Published Data for Merge Replication
Parametrisierte ZeilenfilterParameterized Row Filters