Partager via


Comment la réplication de fusion évalue les partitions dans des publications filtrées

Lorsqu'une ou plusieurs tables d'une publication sont filtrées à l'aide de filtres paramétrés et de filtres de jointure, les données des tables publiées sont partitionnées. Une partition est tout simplement un sous-jeu de données des lignes d'une table. Lorsqu'un Abonné se synchronise avec un serveur de publication, ce dernier doit déterminer les lignes qui appartiennent à la partition de l'Abonné en fonction des valeurs fournies par l'Abonné pour les fonctions système SUSER_SNAME() et/ou HOST_NAME(). Le processus qui consiste à déterminer l'appartenance des modifications aux partitions sur le serveur de publication, pour chaque Abonné recevant un jeu de données filtré, s'appelle l'évaluation des partitions.

Selon les données contenues dans les tables publiées et les paramètres choisis lors de la création d'un filtre paramétré et de ses filtres de jointure associés, chaque ligne d'une table publiée peut :

  • appartenir à une partition et être répliquée sur un seul Abonné (valeur 3 pour le paramètre @partition_options de sp_addmergearticle). Par exemple, dans la base de données AdventureWorks, vous pouvez filtrer la table Employee à l'aide de la clause de filtre suivante : WHERE Employee.LoginID = SUSER_SNAME(). La ligne correspondant à chaque ID de connexion est envoyée à un seul Abonné ;

  • appartenir à une partition et être répliquée sur plusieurs Abonnés (valeur 2 pour le paramètre @partition_options). Par exemple, dans la base de données AdventureWorks, vous pouvez filtrer la table Products à l'aide de la clause de filtre suivante : WHERE Products.ProductLine = HOST_NAME(). La valeur de HOST_NAME() est supplantée par la valeur « M » dans toutes les lignes de la colonne ProductLine pour le groupe de commerciaux chargé des ventes de VTT ; chaque ligne ayant cette valeur appartient à une seule partition mais est envoyée à plusieurs Abonnés. Pour plus d'informations sur l'utilisation de HOST_NAME(), consultez la section « Filtrage avec HOST_NAME() » dans Filtres de lignes paramétrés ;

  • appartenir à plusieurs partitions et être répliquée sur plusieurs Abonnés (valeur 0 ou 1 pour le paramètre @partition_options). Par exemple, dans la base de données AdventureWorks, vous pouvez filtrer la table Products à l'aide de la clause de filtre suivante : WHERE Products.ProductLine = HOST_NAME() or Products.ListPrice < 100. Dans ce cas, les commerciaux chargés des ventes de VTT peuvent également vendre des produits dans d'autres catégories, à condition que le prix de vente ne dépasse pas 100 dollars. La ligne peut appartenir à plusieurs partitions du fait de la présence de l'opérateur OR dans la clause du filtre.

Évaluation des partitions

Dans la réplication de fusion, l'évaluation des partitions est assurée de deux manières, selon que la fonction de partitions précalculées est utilisée ou non. Si certaines conditions sont réunies, les nouvelles publications de fusion sont créées par défaut avec la fonctionnalité de partitions calculées activée ; les publications existantes sont automatiquement mises à jour pour pouvoir utiliser cette fonctionnalité. Pour obtenir une liste complète des conditions, consultez Optimisation des performances des filtres paramétrés avec des partitions précalculées.

Évaluation des partitions à l'aide des partitions précalculées

Avec les partitions précalculées, l'appartenance aux partitions de toutes les modifications du serveur de publication est précalculée et persiste pendant toute la durée des modifications apportées aux tables publiées. Par conséquent, lorsqu'un Abonné se synchronise avec le serveur de publication, il peut immédiatement démarrer le téléchargement des modifications concernant sa partition sans passer par le processus d'évaluation des partitions. Les gains de performances sont importants, surtout lorsque la publication comporte beaucoup de modifications, d'Abonnés ou d'articles.

Les tables système participant à l'évaluation précalculée des partitions sont les suivantes :

  • MSmerge_partition_groups

  • MSmerge_current_partition_mappings

  • MSmerge_past_partition_mappings

MSmerge_partition_groups contient une ligne pour chaque partition définie dans une publication. Les partitions peuvent être :

  • définies explicitement à l'aide de la table sp_addmergepartition ou de la page Partitions de données de la boîte de dialogue Propriétés de la publication ;

  • créées automatiquement lors de la synchronisation d'un Abonné si celui-ci requiert une partition qui n'a pas encore d'entrée dans la table MSmerge_partition_groups.

Les deux autres tables (MSmerge_current_partition_mappings et MSmerge_past_partition_mappings) sont renseignées au fur et à mesure que des modifications sont apportées aux tables publiées. Chaque fois qu'une modification est apportée à une table publiée de la base de données de publication, un déclencheur de fusion active et enregistre des métadonnées :

  • La table MSmerge_partition_groups contient une ligne pour chaque combinaison unique de lignes des tables MSmerge_contents et MSmerge_partition_groups. Par exemple, si une ligne d'une table utilisateur appartient à deux partitions et si la ligne est mise à jour, une ligne est insérée dans la table MSmerge_contents pour refléter la modification ; par ailleurs, deux lignes sont insérées dans la table MSmerge_current_partition_mappings pour indiquer que la ligne mise à jour appartient aux deux partitions.

  • La table MSmerge_past_partition_mappings contient une ligne pour chaque ligne n'appartenant pas à une partition donnée. Une ligne sort d'une partition si :

    • la ligne est supprimée. Si une ligne est supprimée d'une table utilisateur, une ligne est insérée dans la table MSmerge_tombstone et une ou plusieurs lignes sont insérées dans la table MSmerge_past_partition_mappings ;

    • la valeur d'une colonne utilisée pour le filtrage a été modifiée. Par exemple, si un filtre paramétré est basé sur le département dans lequel une société est implantée et que la société déménage, la ligne correspondant à la société (et toutes les lignes associées des autres tables) peut être transférée de la partition de données d'un commercial vers la partition d'un autre commercial. Si une ligne est mise à jour et n'appartient plus à une partition, une ligne est insérée ou est mise à jour dans la table MSmerge_contents ; par ailleurs, une ou plusieurs lignes sont insérées dans la table MSmerge_past_partition_mappings.

    [!REMARQUE]

    Si des partitions sans chevauchement avec un abonnement par partition (valeur 3 pour le paramètre @partition_options de la procédure stockée sp_addmergearticle) sont utilisées, les tables système MSmerge_current_partition_mappings et MSmerge_past_partition_mappings ne sont pas utilisées pour effectuer le suivi des mappages de partition des lignes, car chaque ligne appartient à une seule partition et est modifiable sur un seul Abonné.

Évaluation des partitions à l'aide du processus « SetupBelongs »

Sans partitions précalculées, un processus appelé SetupBelongs est utilisé. Lors de la synchronisation, l'évaluation des partitions a lieu pour chaque modification apportée à une table filtrée sur le serveur de publication, depuis la dernière exécution de l'Agent de fusion pour un Abonné spécifique. Ce processus recommence pour chaque Abonné qui se synchronise avec le serveur de publication.

Pour effectuer l'évaluation des partitions pour un Abonné, l'Agent de fusion appelle la procédure système stockée sp_MSsetupbelongs qui effectue les opérations suivantes :

  1. crée deux tables temporaires pour chaque article filtré : #belongs_<RandomNumber> et #notbelongs_<RandomNumber> ;

  2. utilise la valeur renvoyée par les fonctions SUSER_SNAME() et/ou HOST_NAME() sur l'Abonné pour interroger une vue système ; l'interrogation détermine si une ligne de la table MSmerge_contents ou MSmerge_tombstone est appropriée pour la partition de l'Abonné.

  3. Si le ligne n'est pas appropriée à l'Abonné (telle qu'un insertion pour une autre partition), les métadonnées correspondant à cette ligne ne sont pas stockées dans #belongs ni dans #notbelongs. Si la ligne est appropriée, deux résultats sont possibles :

    • Une ligne est ajoutée dans #belongs si : la ligne contenue dans la table MSmerge_contents est une insertion qui appartient à la partition ou si la ligne contenue dans la table MSmerge_contents est une mise à jour qui ne modifie pas les valeurs des colonnes utilisées pour le filtrage.

    • Une ligne est ajoutée dans #notbelongs si : la ligne contenue dans la table MSmerge_contents est une mise à jour qui modifie une valeur d'une colonne utilisée pour le filtrage (autrement dit, la ligne est déplacée vers une nouvelle partition) ou si la ligne contenue dans la table MSmerge_tombstone représente la suppression d'une ligne de la partition.

[!REMARQUE]

Même si les partitions précalculées sont activées, le processus « SetupBelongs » est utilisé lors de la première synchronisation d'un abonnement si celui-ci est créé après que d'autres abonnements ont commencé à recevoir des modifications.