Filtres de jointure
Un filtre de jointure permet à une table d'être filtrée sur la base du filtrage d'une table associée de la publication. 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. 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.
Les filtres de jointure correspondent généralement aux relations de clé primaire/clé étrangère définies pour les tables auxquelles elles sont appliquées, mais ils ne sont pas strictement limités à ces relations clé primaire/clé étrangère. Le filtre de jointure peut être basé sur toute logique comparant des données associées dans deux tables.
Supposons les tables suivantes dans la base de données exemple Adventure Works, qui sont associées via des relations de clé primaire à clé étrangère :
HumanResources.Employee
Sales.SalesOrderHeader
Sales.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.
La première étape consiste à définir un filtre paramétré sur la table parente, qui est dans cet exemple la table HumanResources.Employee. Cette table comprend la colonne LoginID, qui contient le nom de connexion de chaque employé sous la forme 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 :
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). Pour plus d'informations, consultez Filtres de lignes paramétrés.
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. La première clause du filtre de jointure est :
Employee.EmployeeID = SalesOrderHeader.SalesPersonID
Ceci fait que l'abonnement contient seulement les données des commandes concernant chacun des commerciaux. La seconde clause du filtre de jointure est :
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. Cet exemple montre une table jointe à chaque point ; il est également possible de joindre plusieurs tables à chaque 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. 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.
SQL Server Management Studio : Procédure : définir et modifier un filtre de jointure entre des articles de fusion (SQL Server Management Studio) et Procédure : générer automatiquement un ensemble de filtres de jointure entre des articles de fusion (SQL Server Management Studio)
Programmation Transact-SQL de la réplication : Procédure : définir et modifier un filtre de jointure entre des articles de fusion (programmation Transact-SQL de la réplication)
Programmation RMO (Replication Management Objects) : Procédure : définir un article (programmation RMO)
Optimisation des performances des filtres de jointure
Les performances des filtres de jointure peuvent être optimisées en suivant ces conseils :
Limitez le nombre de tables dans la hiérarchie du filtre de jointure.
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. Si vous générez des filtres de jointure sur cinq tables ou plus, envisagez d'autres solutions : ne filtrez pas des tables de petite taille, non sujettes à modifications ou qui sont principalement des tables de consultation. Utilisez des filtres de jointure seulement entre des tables qui doivent être partitionnées entre des abonnements.
Définissez l'option join unique key à True là où c'est approprié.
Le traitement de fusion a des possibilités d'optimisation des performances spéciales si la colonne jointe dans le parent est 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. Pour des informations sur la définition de cette option, consultez les rubriques de procédure dont la liste figure dans la section précédente.
Vérifiez que les colonnes référencées dans les filtres de jointure sont indexées.
Si les colonnes référencées dans le filtre sont indexées, la réplication peut traiter les filtres plus efficacement.
Ne créez pas de filtres de lignes équivalents aux filtres de jointure.
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 :
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. 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.