Bonnes pratiques en matière de filtres de lignes basés sur le tempsBest Practices for Time-Based Row 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

Les utilisateurs d'applications ont souvent besoin d'un sous-ensemble de données d'une table basé sur le temps.Users of applications often require a time-based subset of data from a table. Par exemple, un vendeur peut avoir besoin des données sur les commandes passées au cours de la dernière semaine tandis qu'un planificateur d'événements peut avoir besoin des données sur les événements qui auront lieu au cours de la semaine à venir.For instance, a salesperson might require data for orders in the last week, or an event planner might require data for events in the upcoming week. Dans de nombreux cas, pour accomplir cette tâche, les applications utilisent des requêtes qui contiennent la fonction GETDATE() .In many cases, applications use queries containing the GETDATE() function to accomplish this. Considérons l'instruction de filtre de lignes suivante :Consider the following row filter statement:

WHERE SalesPersonID = CONVERT(INT,HOST_NAME()) AND OrderDate >= (GETDATE()-6)  

Avec un filtre de ce type, il est généralement admis que deux événements se produisent systématiquement à l'exécution de l'Agent de fusion : les lignes qui satisfont aux critères de ce filtre sont répliquées vers les Abonnés, tandis que celles qui n'y satisfont plus sont nettoyées sur ceux-ci.With a filter of this type, it is usually assumed that two things always occur when the Merge Agent runs: rows that satisfy this filter are replicated to Subscribers; and rows that no longer satisfy this filter are cleaned up at Subscribers. (Pour plus d’informations sur les options de filtrage avec HOST_NAME() , consultez Filtres de lignes paramétrés.) Toutefois, la réplication de fusion ne fait que répliquer et nettoyer les données qui ont changé depuis la dernière synchronisation, quelle que soit la façon dont vous définissez un filtre de lignes pour ces données.(For more information about filtering with HOST_NAME(), see Parameterized Row Filters.) However, merge replication only replicates and cleans up data that has changed since the last synchronization, regardless of how you define a row filter for that data.

Pour que la réplication de fusion traite une ligne, les données contenues dans celle-ci doivent satisfaire aux critères du filtre de lignes et avoir changé depuis la dernière synchronisation.For merge replication to process a row, the data in the row must satisfy the row filter, and it must have changed since the last synchronization. Dans le cas de la table SalesOrderHeader , OrderDate est entré lorsqu'une ligne est insérée.In the case of the SalesOrderHeader table, OrderDate is entered when a row is inserted. Les lignes sont répliquées vers l'Abonné comme prévu car l'insertion constitue une modification de données.Rows are replicated to the Subscriber as expected because the insert is a data change. Toutefois, s'il existe des lignes sur l'Abonné qui ne satisfont plus aux critères de filtre (relatives en l'occurrence aux commandes qui datent de plus de sept jours), elles ne sont supprimées de l'Abonné que si elles ont été mises à jour pour une raison quelconque.However, if there are rows at the Subscriber that no longer satisfy the filter (they are for orders older than seven days), they are not removed from the Subscriber unless they were updated for some other reason.

Le cas du planificateur d'événements met davantage en lumière le problème lié à ce type de filtrage.The case of the event planner further highlights the issue with this type of filtering. Considérons le filtre suivant pour une table Events :Consider the following filter for an Events table:

WHERE EventCoordID = CONVERT(INT,HOST_NAME()) AND EventDate <= (GETDATE()+6)  

Dans le cas d'une table qui contient des événements, les insertions peuvent être réalisées largement à l'avance par rapport à la date de l'événement.For a table that contains events, inserts might be made well ahead of the event date. Si l'insertion d'un événement qui doit avoir lieu au cours de la semaine à venir a été réalisée avec un mois d'avance et que la ligne n'a pas été mise à jour pour une raison quelconque, la ligne n'est pas répliquée vers l'Abonné même si elle satisfait aux critères du filtre de lignes.If the insert for an event in the coming week was made a month ago and the row was not updated for another reason, the row is not replicated to the Subscriber even if it satisfies the row filter.

En outre, suivant la configuration de la publication, la réplication de fusion évalue les filtres à différents moments :In addition, depending on how the publication is configured, merge replication evaluates filters at different times:

  • Si une publication utilise des partitions précalculées (configuration par défaut), les filtres sont évalués lorsqu'une ligne est insérée ou mise à jour.If a publication uses precomputed partitions (the default), filters are evaluated when a row is inserted or updated.

  • Si la publication n'utilise pas de partitions précalculées, les filtres sont évalués à l'exécution de l'Agent de fusion.If the publication does not use precomputed partitions, filters are evaluated when the Merge Agent runs.

Pour plus d’informations sur les partitions précalculées, consultez Optimiser les performances des filtres paramétrés avec des partitions précalculées.For more information about precomputed partitions, see Optimize Parameterized Filter Performance with Precomputed Partitions. Le moment auquel le filtre est évalué détermine les données qui satisfont aux critères de ce filtre.The time at which the filter is evaluated affects what data satisfies the filter. Par exemple, si une publication utilise des partitions précalculées et que vous synchronisez les données tous les deux jours, le sous-ensemble de données pour le vendeur peut comprendre des lignes dont l'ancienneté dépasse les deux jours prévus.For example, if a publication uses precomputed partitions, and you synchronize data every two days, the subset of data for the salesperson could include rows up to two days older than expected.

Recommandations pour l'utilisation de filtres de lignes basés sur le tempsRecommendations for Using Time-Based Row Filters

La méthode suivante propose une approche fiable et directe du filtrage en fonction du temps :The following method provides a robust and straightforward approach to filtering based on time:

  • Ajoutez une colonne à la table de type de données bit.Add a column to the table of data type bit. Cette colonne permet d'indiquer si une ligne doit être répliquée.This column is used to indicate whether a row should be replicated.

  • Utilisez un filtre de lignes qui référence la nouvelle colonne plutôt qu'une colonne basée sur le temps.Use a row filter that references the new column rather than a time-based column.

  • Créez un travail de l'Agent SQL Server (ou un travail planifié par le biais d'un autre mécanisme) qui met à jour la colonne avant que ne soit planifiée l'exécution de l'Agent de fusion.Create a SQL Server Agent job (or a job scheduled through another mechanism) that updates the column before the Merge Agent is scheduled to run.

Cette approche pallie les points faibles de l'utilisation de GETDATE() ou d'une autre méthode basée sur le temps et évite d'avoir à déterminer à quel moment les filtres sont évalués pour les partitions.This approach addresses the shortcomings of using GETDATE() or another time-based method and avoids the problem of having to determine when filters are evaluated for partitions. Considérons l'exemple suivant d'une table Events :Consider the following example of an Events table:

EventIDEventID EventNameEventName EventCoordIDEventCoordID EventDateEventDate RépliquerReplicate
11 RéceptionReception 112112 2006-10-042006-10-04 11
22 DînerDinner 112112 2006-10-102006-10-10 00
33 SoiréeParty 112112 2006-10-112006-10-11 00
44 MariageWedding 112112 2006-10-122006-10-12 00

Le filtre de lignes de cette table ressemblerait à ceci :The row filter for this table would then look like this:

WHERE EventCoordID = CONVERT(INT,HOST_NAME()) AND Replicate = 1  

Le travail de l'Agent SQL Server pourrait exécuter des instructions Transact-SQLTransact-SQL similaires à la suivante avant chaque exécution de l'Agent de fusion :The SQL Server Agent job could execute Transact-SQLTransact-SQL statements similar to the following before each Merge Agent run:

UPDATE Events SET Replicate = 0 WHERE Replicate = 1  
GO  
UPDATE Events SET Replicate = 1 WHERE EventDate <= GETDATE()+6  
GO  

La première ligne réinitialise la colonne Replicate à 0, tandis que la seconde lui attribue la valeur 1 pour les événements qui se produiront au cours des sept prochains jours.The first line resets the Replicate column to 0, and the second line sets the column to 1 for events that occur in the next seven days. Si cette instruction Transact-SQLTransact-SQL s'exécute le 07/10/2006, la table, une fois mise à jour, présentera l'aspect suivant :If this Transact-SQLTransact-SQL statement runs on 10/07/2006, the table is updated to:

EventIDEventID EventNameEventName EventCoordIDEventCoordID EventDateEventDate RépliquerReplicate
11 RéceptionReception 112112 2006-10-042006-10-04 00
22 DînerDinner 112112 2006-10-102006-10-10 11
33 SoiréeParty 112112 2006-10-112006-10-11 11
44 MariageWedding 112112 2006-10-122006-10-12 11

Les événements relatifs à la semaine à venir sont désormais signalés comme étant prêts à être répliqués.The events for the next week are now flagged as being ready to replicate. La prochaine fois que l'Agent de fusion s'exécutera pour l'abonnement utilisé par le coordinateur d'événements 112, les lignes 2, 3 et 4 seront téléchargées vers l'Abonné tandis que la ligne 1 sera supprimée de celui-ci.The next time the Merge Agent runs for the subscription that event coordinator 112 uses, rows 2, 3, and 4 will be downloaded to the Subscriber and row 1 will be removed from the Subscriber.

Voir aussiSee Also

GETDATE (Transact-SQL) GETDATE (Transact-SQL)
Implémenter des travaux Implement Jobs
Filtres de lignes paramétrésParameterized Row Filters