시간 기반 행 필터에 대한 최상의 구현 방법Best Practices for Time-Based Row Filters

응용 프로그램 사용자가 테이블의 시간 기반 데이터 하위 집합을 필요로 하는 경우가 종종 있습니다.Users of applications often require a time-based subset of data from a table. 예를 들어 영업 사원이 지난 주의 주문 데이터를 필요로 하거나, 행사 계획자가 다음 주의 행사 데이터를 필요로 할 수 있습니다.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. 대부분의 경우 응용 프로그램에서는 GETDATE() 함수가 들어 있는 쿼리를 사용하여 이 작업을 수행합니다.In many cases, applications use queries containing the GETDATE() function to accomplish this. 예를 들어 다음과 같은 행 필터 문을 사용한다고 가정합니다.Consider the following row filter statement:

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

이 유형의 필터를 사용하면 일반적으로 병합 에이전트가 실행될 때 항상 두 가지 작업이 실행됩니다. 즉, 이 필터를 만족하는 행은 구독자에 복제되고 이 필터를 더 이상 만족하지 않는 행은 구독자에서 정리됩니다.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. HOST_NAME()을 사용한 필터링에 대한 자세한 내용은 매개 변수가 있는 행 필터를 참조하세요. 그러나 병합 복제에서는 데이터에 대한 행 필터 정의 방식에 관계없이 마지막 동기화 이후에 변경된 데이터만 복제되고 정리됩니다.(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.

행을 처리하는 병합 복제의 경우 행에 있는 데이터는 행 필터를 만족하고 마지막 동기화 이후에 변경된 데이터여야 합니다.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. SalesOrderHeader 테이블의 경우 행이 삽입될 때 OrderDate 가 입력됩니다.In the case of the SalesOrderHeader table, OrderDate is entered when a row is inserted. 행 삽입은 데이터 변경에 해당하므로 해당 행은 구독자에 예상대로 복제됩니다.Rows are replicated to the Subscriber as expected because the insert is a data change. 그러나 구독자에 필터를 더 이상 만족하지 않는 행(예: 7일 이상 경과된 주문)이 있는 경우 해당 행은 다른 이유로 업데이트되지 않았으면 구독자에서 제거되지 않습니다.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.

행사 계획자의 경우 이 유형의 필터링을 사용하여 원하는 항목을 찾을 수 있습니다.The case of the event planner further highlights the issue with this type of filtering. 예를 들어 Events 테이블에 대해 다음과 같은 필터를 사용한다고 가정합니다.Consider the following filter for an Events table:

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

행사가 포함되는 테이블의 경우 행사 날짜 전에 행사를 삽입할 수 있습니다.For a table that contains events, inserts might be made well ahead of the event date. 다음 주 행사를 한 달 전에 삽입하고 해당 행을 업데이트하지 않았으면 해당 행은 행 필터를 만족하더라도 구독자에 복제되지 않습니다.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.

또한 병합 복제에서 필터가 평가되는 시기는 다음과 같이 게시가 구성된 방식에 따라 달라집니다.In addition, depending on how the publication is configured, merge replication evaluates filters at different times:

  • 게시에서 사전 계산 파티션(기본값)을 사용하면 행을 삽입하거나 업데이트할 때 필터가 평가됩니다.If a publication uses precomputed partitions (the default), filters are evaluated when a row is inserted or updated.

  • 게시에서 사전 계산 파티션을 사용하지 않으면 병합 에이전트가 실행할 때 필터가 평가됩니다.If the publication does not use precomputed partitions, filters are evaluated when the Merge Agent runs.

    사전 계산 파티션에 대한 자세한 내용은 사전 계산 파티션으로 매개 변수가 있는 필터 성능 최적화를 참조하세요.For more information about precomputed partitions, see Optimize Parameterized Filter Performance with Precomputed Partitions. 필터가 평가되는 시기는 필터를 만족하는 데이터에 영향을 줍니다.The time at which the filter is evaluated affects what data satisfies the filter. 예를 들어 게시에서 사전 계산 파티션을 사용하는 경우 데이터를 2일마다 동기화하면 영업 사원의 데이터 하위 집합에는 예상보다 최대 2일이 더 오래된 행이 포함될 수 있습니다.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.

시간 기반 행 필터 사용에 대한 권장 사항Recommendations for Using Time-Based Row Filters

시간을 기반으로 필터링하기 위한 강력하고 간단한 방법은 다음과 같습니다.The following method provides a robust and straightforward approach to filtering based on time:

  • bit데이터 형식의 테이블에 열을 추가합니다.Add a column to the table of data type bit. 이 열은 행이 복제되는지 여부를 나타내는 데 사용합니다.This column is used to indicate whether a row should be replicated.

  • 시간 기반 열 이외의 새 열을 참조하는 행 필터를 사용합니다.Use a row filter that references the new column rather than a time-based column.

  • 병합 에이전트의 예약된 실행 시간 전에 열을 업데이트하는 SQL Server 에이전트 작업(또는 다른 메커니즘을 통해 예약된 작업)을 만듭니다.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.

    이 방법을 사용하면 GETDATE() 나 다른 시간 기반 메서드를 사용할 때의 문제를 해결할 수 있으며 파티션에 대해 필터가 평가되는 시기를 지정하지 않아도 됩니다.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. 예를 들어 다음과 같은 Events 테이블이 있다고 가정합니다.Consider the following example of an Events table:

EventIDEventID EventNameEventName EventCoordIDEventCoordID EventDateEventDate 복제Replicate
11 ReceptionReception 112112 2006-10-042006-10-04 11
22 DinnerDinner 112112 2006-10-102006-10-10 00
33 PartyParty 112112 2006-10-112006-10-11 00
44 WeddingWedding 112112 2006-10-122006-10-12 00

이 테이블에 다음과 같은 행 필터를 사용할 수 있습니다.The row filter for this table would then look like this:

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

각 병합 에이전트가 실행되기 전에 SQL Server 에이전트 작업은 다음과 유사한 Transact-SQLTransact-SQL 문을 실행할 수 있습니다.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  

첫째 줄은 Replicate 열을 0으로 다시 설정하고 둘째 줄은 다음 7일 안에 개최되는 행사에 대해 이 열을 1 로 설정합니다.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. 2006년 10월 7일에 이 Transact-SQLTransact-SQL 문을 실행하면 해당 테이블은 다음과 같이 업데이트됩니다.If this Transact-SQLTransact-SQL statement runs on 10/07/2006, the table is updated to:

EventIDEventID EventNameEventName EventCoordIDEventCoordID EventDateEventDate 복제Replicate
11 ReceptionReception 112112 2006-10-042006-10-04 00
22 DinnerDinner 112112 2006-10-102006-10-10 11
33 PartyParty 112112 2006-10-112006-10-11 11
44 WeddingWedding 112112 2006-10-122006-10-12 11

이제 다음 주의 행사가 복제할 행사로 플래그가 지정됩니다.The events for the next week are now flagged as being ready to replicate. 다음에 행사 코디네이터 112가 사용하는 구독에 대해 병합 에이전트가 실행되면 행 2, 3 및 4는 구독자에 다운로드되고 행 1은 구독자에서 제거됩니다.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.

참고 항목See Also

GETDATE(Transact-SQL) GETDATE (Transact-SQL)
작업 구현 Implement Jobs
매개 변수가 있는 행 필터 Parameterized Row Filters