시간 기반 행 필터에 대한 최상의 구현 방법

적용 대상:SQL Server

애플리케이션 사용자는 종종 테이블의 시간 기반 데이터 하위 집합이 필요합니다. 예를 들어 영업 사원이 지난 주의 주문 데이터를 필요로 하거나, 행사 계획자가 다음 주의 행사 데이터를 필요로 할 수 있습니다. 대부분의 경우 애플리케이션은 GETDATE() 함수를 포함하는 쿼리를 사용하여 이 작업을 수행합니다. 다음 행 필터 문을 고려합니다.

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

이 형식의 필터를 사용하면 일반적으로 병합 에이전트가 실행될 때 항상 두 가지가 발생한다고 가정합니다. 이 필터를 충족하는 행은 구독자에 복제됩니다. 이 필터를 더 이상 충족하지 않는 행은 구독자에서 정리됩니다. (다음을 사용하여 필터링하는 방법에 대한 자세한 내용HOST_NAME()는 매개 변수가 있는 행 필터를 참조 하세요.) 그러나 병합 복제는 해당 데이터에 대한 행 필터를 정의하는 방법에 관계없이 마지막 동기화 이후 변경된 데이터만 복제하고 정리합니다.

병합 복제가 행을 처리하려면 행의 데이터가 행 필터를 충족해야 하며 마지막 동기화 이후 변경되어야 합니다. SalesOrderHeader 테이블경우 행이 삽입될 때 OrderDate가 입력됩니다. 삽입이 데이터 변경이므로 행이 예상대로 구독자에 복제됩니다. 그러나 구독자에 필터를 더 이상 만족하지 않는 행(예: 7일 이상 경과된 주문)이 있는 경우 해당 행은 다른 이유로 업데이트되지 않았으면 구독자에서 제거되지 않습니다.

행사 계획자의 경우 이 유형의 필터링을 사용하여 원하는 항목을 찾을 수 있습니다. 이벤트 테이블에 대해 다음 필터를 고려합니다.

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

이벤트가 포함된 테이블의 경우 이벤트 날짜보다 먼저 삽입할 수 있습니다. 다음 주에 이벤트에 대한 삽입이 한 달 전에 만들어졌고 다른 이유로 행이 업데이트되지 않은 경우 행 필터를 충족하더라도 행이 구독자에 복제되지 않습니다.

또한 게시를 구성하는 방법에 따라 병합 복제는 서로 다른 시간에 필터를 평가합니다.

  • 게시에서 사전 계산 파티션(기본값)을 사용하는 경우 행을 삽입하거나 업데이트할 때 필터가 평가됩니다.

  • 게시에서 사전 계산 파티션을 사용하지 않는 경우 병합 에이전트가 실행될 때 필터가 평가됩니다.

사전 계산 파티션에 대한 자세한 내용은 미리 계산된 파티션을 사용하여 매개 변수가 있는 필터 성능 최적화를 참조 하세요. 필터가 평가되는 시간은 필터를 충족하는 데이터에 영향을 줍니다. 예를 들어 게시에서 사전 계산 파티션을 사용하는 경우 데이터를 2일마다 동기화하면 영업 사원의 데이터 하위 집합에는 예상보다 최대 2일이 더 오래된 행이 포함될 수 있습니다.

시간 기반 행 필터 사용에 대한 권장 사항

시간을 기반으로 필터링하기 위한 강력하고 간단한 방법은 다음과 같습니다.

  • 데이터 형식 비트 테이블에 열을 추가합니다. 이 열은 행을 복제해야 하는지 여부를 나타내는 데 사용됩니다.

  • 시간 기반 열이 아닌 새 열을 참조하는 행 필터를 사용합니다.

  • 병합 에이전트가 실행되도록 예약되기 전에 열을 업데이트하는 SQL Server 에이전트 작업(또는 다른 메커니즘을 통해 예약된 작업)을 만듭니다.

이 방법은 GETDATE() 또는 다른 시간 기반 메서드를 사용하는 단점을 해결하고 파티션에 대한 필터가 평가되는 시기를 결정해야 하는 문제를 방지합니다. 이벤트 테이블의 다음 예제를 살펴보겠습니다.

EventID EventName EventCoordID EventDate 복제
6 Reception 112 2006-10-04 1
2 저녁 식사 112 2006-10-10 0
3 파티 112 2006-10-11 0
4 결혼식 112 2006-10-12 0

이 테이블의 행 필터는 다음과 같습니다.

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

SQL Server 에이전트 작업은 각 병합 에이전트를 실행하기 전에 다음과 유사한 Transact-SQL 문을 실행할 수 있습니다.

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

첫 번째 줄은 복제 열을 0으로 다시 설정하고 두 번째 줄은 다음 7일 동안 발생하는 이벤트에 대해 열을 1로 설정합니다. 이 Transact-SQL 문이 2006년 10월 7일에 실행되는 경우 테이블은 다음으로 업데이트됩니다.

EventID EventName EventCoordID EventDate 복제
6 Reception 112 2006-10-04 0
2 저녁 식사 112 2006-10-10 6
3 파티 112 2006-10-11 6
4 결혼식 112 2006-10-12 6

이제 다음 주에 대한 이벤트는 복제할 준비가 된 것으로 플래그가 지정됩니다. 다음에 이벤트 코디네이터 112가 사용하는 구독에 대해 병합 에이전트가 실행될 때 2, 3, 4행이 구독자에 다운로드되고 1행이 구독자에서 제거됩니다.

참고 항목

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