Filtres de jointureJoin Filters

S’APPLIQUE À : ouiSQL Server nonAzure SQL Database nonAzure Synapse Analytics (SQL DW) nonParallel Data Warehouse APPLIES TO: yesSQL Server noAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

Un filtre de jointure permet de filtrer une table en fonction du filtrage d'une table associée dans la publication.A join filter allows a table to be filtered based on how a related table in the publication is filtered. En général, une table parente est filtrée à l'aide d'un filtre paramétré ; un ou plusieurs filtres de jointure sont ensuite définis à peu près de la même façon que vous définissez une jointure entre des tables.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. Les filtres de jointure étendent le filtre paramétré de telle façon que les données des tables liées soient répliquées seulement si elles correspondent à la clause du filtre de jointure.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.

En règle générale, les filtres de jointure suivent les relations clé primaire/clé étrangère définies pour les tables auxquelles ils sont appliqués, mais ils ne sont pas strictement limités à ces relations.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. Le filtre de jointure peut être basé sur toute logique comparant des données associées dans deux tables.The join filter can be based on any logic that compares related data in two tables.

Supposons les tables suivantes dans la base de données exemple Adventure WorksAdventure Works , qui sont associées via des relations de clé primaire à clé étrangère :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

Ces tables peuvent être utilisées dans une application d'aide aux forces de ventes mobiles, mais elles doivent être filtrées de façon à ce que chaque commercial de la table HumanResources.Employee reçoive seulement les données se rapportant aux commandes de ses clients.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.

La première étape consiste à définir un filtre paramétré sur la table parente, qui est dans cet exemple la table HumanResources.Employee .The first step is to define a parameterized filter on the parent table, which in this example is the HumanResources.Employee table. Cette table comprend la colonne LoginID, qui contient le nom de connexion de chaque employé sous la forme domain\login.This table includes the column LoginID, which contains the login for each employee in the form domain\login. Pour filtrer cette table de façon à ce que chaque employé reçoive seulement les données qui le concernent, spécifiez la clause de filtre paramétré suivante :To filter this table so that each employee receives only the data related to them, specify a parameterized filter clause of:

LoginID = SUSER_SNAME()  

Ce filtre garantit que l'abonnement de chaque employé contient seulement les données de la table HumanResources.Employee qui se rapportent à cet employé (une seule ligne dans le cas présent).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). Pour plus d’informations, voir Parameterized Row Filters.For more information, see Parameterized Row Filters.

L'étape suivante consiste à étendre ce filtre à chacune des tables associées, à l'aide d'une syntaxe similaire à celle qui est utilisée pour spécifier une jointure entre deux tables.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. La première clause du filtre de jointure est :The first join filter clause is:

Employee.EmployeeID = SalesOrderHeader.SalesPersonID  

Ceci fait que l'abonnement contient seulement les données des commandes concernant chacun des commerciaux.This ensures the subscription contains only the order data relevant to each sales person. La seconde clause du filtre de jointure est :The second join filter clause is:

SalesOrderHeader.SalesOrderID = SalesOrderDetail.SalesOrderID  

Ceci fait que l'abonnement contient seulement les données détaillées associées aux données des commandes pour chacun des commerciaux.This ensures the subscription contains only the detail data related to the order data for each sales person. Cet exemple montre une table jointe à chaque point ; il est également possible de joindre plusieurs tables à chaque point.This example shows a single table being joined at each point; it is also possible to join more than one table at each point.

Les filtres de jointure peuvent être ajoutés un par un via l'Assistant Nouvelle publication et la boîte de dialogue Propriétés de la publication , ou bien ils peuvent être ajoutés par programmation.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. Ils peuvent aussi être générés automatiquement via l'Assistant Nouvelle publication : vous spécifiez un filtre de lignes pour une table et des filtres de jointure sont appliqués à toutes les tables associées.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. Pour plus d’informations, consultez Définir et modifier un filtre de jointure entre des articles de fusion, Générer automatiquement un ensemble de filtres de jointure entre des articles de fusion (SQL Server Management Studio), et Définir un article.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.

Optimisation des performances des filtres de jointureOptimizing Join Filter Performance

Les performances des filtres de jointure peuvent être optimisées en suivant ces conseils :Join filter performance can be optimized by following these guidelines:

  • Limitez le nombre de tables dans la hiérarchie du filtre de jointure.Limit the number of tables in the join filter hierarchy.

    Les filtres de jointure peuvent impliquer un nombre illimité de tables, mais des filtres avec un grand nombre de tables peuvent avoir un impact significatif sur les performances lors du traitement de la fusion.Join Filters can involve an unlimited number of tables, but filters with a large number of tables can significantly impact performance during merge processing. Si vous générez des filtres de jointure pour au moins cinq tables, envisagez d'autres solutions : ne filtrez pas les petites tables, les tables qui ne changent pas ou les tables de recherche principales.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. Utilisez des filtres de jointure seulement entre des tables qui doivent être partitionnées entre des abonnements.Use join filters only between tables that must be partitioned among subscriptions.

  • Définissez l'option join unique key à True là où c'est approprié.Set the join unique key option to True where appropriate.

    Le traitement de fusion a des possibilités d'optimisation des performances spéciales si la colonne jointe dans le parent est unique.The merge process has special performance optimizations available if the joined column in the parent is unique. Si la condition de jointure est basée sur une colonne unique, définissez l'option join unique key pour le filtre de jointure.If the join condition is based on a unique column, set the join unique key option for the join filter. Pour des informations sur la définition de cette option, consultez les rubriques Procédure dont la liste figure dans la section précédente.For information about setting this option, see the how-to topics listed in the previous section.

  • Vérifiez que les colonnes référencées dans les filtres de jointure sont indexées.Ensure that the columns referenced in join filters are indexed.

    Si les colonnes référencées dans le filtre sont indexées, la réplication peut traiter les filtres plus efficacement.If the columns referenced in the filter are indexed, replication can process the filters more efficiently.

  • Ne créez pas de filtres de lignes équivalents aux filtres de jointure.Do not create row filters that mimic join filters.

    Il est possible de créer des filtres de lignes qui sont équivalents à des filtres de jointure en utilisant une sous-requête dans une clause WHERE, comme ceci :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())   
    

    Il est fortement recommandé que toutes les logiques de ce type soient exprimées dans un filtre de jointure plutôt que dans une sous-requête.It is strongly recommended that all such logic be expressed in a join filter rather than a subquery. Si votre application requiert qu'un filtre de lignes utilise une sous-requête, vérifiez que la sous-requête référence seulement des données de consultation qui ne font pas l'objet de modifications.If your application requires a row filter to use a subsquery, ensure that the subquery only references lookup data that does not change.

Voir aussiSee Also

Filtrer des données publiées en vue de la réplication de fusion Filter Published Data for Merge Replication
Parameterized Row FiltersParameterized Row Filters