병합 복제에서 필터링된 게시의 파티션을 확인하는 방법

매개 변수가 있는 필터와 조인 필터를 사용하여 병합 게시의 테이블을 하나 이상 필터링하면 게시된 테이블의 데이터가 분할됩니다. 파티션은 단순히 테이블에 있는 행의 하위 집합을 가리킵니다. 구독자가 게시자와 동기화할 때 게시자는 구독자가 시스템 함수 SUSER_SNAME() 및/또는 **HOST_NAME()**에 제공한 값을 기준으로 구독자 파티션에 속하는 행을 확인해야 합니다. 게시자에서 필터링된 데이터 집합을 수신하는 각 구독자에 대한 변경 내용의 파티션 멤버 자격을 결정하는 이 과정을 파티션 평가라고 합니다.

게시된 테이블의 데이터와 매개 변수가 있는 필터 및 관련된 모든 조인 필터를 만들 때 선택한 설정에 따라 게시된 테이블의 각 행은 다음과 같을 수 있습니다.

  • 한 파티션에 속하고 한 구독자에만 복제됩니다(sp_addmergearticle 매개 변수 @partition_options의 값이 3). 예를 들어 AdventureWorks2008R2 데이터베이스의 Employee 테이블을 WHERE Employee.LoginID = SUSER_SNAME() 필터 절로 필터링할 수 있습니다. 각 Login ID에 일치하는 행은 한 구독자에만 전송됩니다.

  • 한 파티션에 속하고 둘 이상의 구독자에 복제됩니다(@partition_options의 값이 2). 예를 들어 AdventureWorks2008R2 데이터베이스의 Products 테이블을 WHERE Products.ProductLine = HOST_NAME() 필터 절로 필터링할 수 있습니다. 산악 자전거 판매를 담당하는 영업 사원 그룹이 ProductLine 열의 값이 "M"인 모든 행을 받도록 HOST_NAME() 값은 무시됩니다. 값이 "M"인 각 행은 한 파티션에만 속하지만 둘 이상의 구독자에게 전송됩니다. HOST_NAME() 사용 방법은 매개 변수가 있는 행 필터의 "HOST_NAME()으로 필터링" 섹션을 참조하십시오.

  • 둘 이상의 파티션에 속하고 둘 이상의 구독자에 복제됩니다(@partition_options의 값이 0 또는 1). 예를 들어 AdventureWorks2008R2 데이터베이스의 Products 테이블을 WHERE Products.ProductLine = HOST_NAME() or Products.ListPrice < 100 필터 절로 필터링할 수 있습니다. 이 경우 산악 자전거 판매를 담당하는 영업 사원은 판매 가격이 100달러 미만인 다른 범주의 제품도 판매할 수 있습니다. 필터 절의 OR 때문에 이 행은 둘 이상의 파티션에 속할 수 있습니다.

파티션 평가 방법

파티션 평가는 사전 계산 파티션 기능의 사용 여부에 따라 병합 복제에서 다음 두 가지 방법 중 하나로 수행됩니다. 많은 요구 사항이 충족되면 새 병합 게시는 기본적으로 사전 계산 파티션이 사용 가능한 상태로 만들어지며 기존 게시는 이 기능을 사용하도록 자동으로 업그레이드됩니다. 전체 요구 사항 목록은 사전 계산 파티션으로 매개 변수가 있는 필터 성능 최적화를 참조하십시오.

사전 계산 파티션을 사용하여 파티션 평가

사전 계산 파티션을 사용하면 게시자에서의 모든 변경 내용에 대해 파티션 멤버 자격이 미리 계산되고 게시된 테이블의 변경 내용이 지속적으로 반영됩니다. 결과적으로 구독자가 게시자와 동기화할 때 파티션 평가 과정을 거치지 않고도 파티션과 관련된 변경 내용을 즉시 다운로드할 수 있습니다. 이 기능을 통해 게시에 변경 내용, 구독자 또는 아티클이 많을 경우 성능이 크게 향상될 수 있습니다.

사전 계산 파티션 평가에 필요한 시스템 테이블은 다음과 같습니다.

  • MSmerge_partition_groups

  • MSmerge_current_partition_mappings

  • MSmerge_past_partition_mappings

MSmerge_partition_groups는 게시에 정의된 각 파티션에 대해 하나의 행을 포함합니다. 파티션은 다음 방법으로 정의 또는 생성될 수 있습니다.

  • sp_addmergepartition 또는 게시 속성 대화 상자의 데이터 파티션 페이지를 통해 명시적으로 정의됩니다.

  • 구독자에서 MSmerge_partition_groups에 항목이 없는 파티션이 필요할 경우 동기화 시 자동으로 생성됩니다.

다른 두 테이블(MSmerge_current_partition_mappingsMSmerge_past_partition_mappings)은 게시된 테이블이 변경될 때 채워집니다. 게시 데이터베이스에서 게시된 테이블이 변경될 때마다 병합 트리거가 발생되어 다음 메타데이터를 기록합니다.

  • MSmerge_current_partition_mappingsMSmerge_contentsMSmerge_partition_groups의 각 고유 행 조합에 대해 하나의 행을 포함합니다. 예를 들어 사용자 테이블의 행이 두 개의 파티션에 속할 경우 해당 행이 업데이트되면 하나의 행이 MSmerge_contents에 삽입되어 업데이트가 반영되고 MSmerge_current_partition_mappings에 두 개의 행이 삽입되어 업데이트된 행이 두 개의 파티션에 속함을 나타냅니다.

  • MSmerge_past_partition_mappings는 지정된 파티션에 더 이상 속하지 않는 각 행에 대해 하나의 행을 포함합니다. 다음과 같은 경우 행이 파티션에 속하지 않게 됩니다.

    • 행이 삭제되는 경우. 사용자 테이블에서 행이 삭제될 경우 하나의 행이 MSmerge_tombstone에 삽입되고 하나 이상의 행이 MSmerge_past_partition_mappings에 삽입됩니다.

    • 필터링에 사용된 열의 값이 변경된 경우. 예를 들어 매개 변수가 있는 필터가 본사가 있는 주를 기반으로 하는 경우 회사가 이전하게 되면 회사에 대한 행 및 다른 테이블의 관련 행이 해당 영업 사원의 데이터 파티션에서 다른 영업 사원의 파티션으로 이동할 수 있습니다. 행이 업데이트되어 파티션에 더 이상 속하지 않게 될 경우 하나의 행이 MSmerge_contents에 삽입 또는 업데이트되고 하나 이상의 행이 MSmerge_past_partition_mappings에 삽입됩니다.

    [!참고]

    파티션당 하나의 구독이 있는 겹치지 않는 파티션(sp_addmergearticle 매개 변수 @partition_options의 값이 3)을 사용하는 경우 각 행이 한 파티션에만 속하고 한 구독자에서만 변경할 수 있기 때문에 시스템 테이블 MSmerge_current_partition_mappingsMSmerge_past_partition_mappings를 사용하여 행의 파티션 매핑을 추적하지 않습니다.

SetupBelongs 프로세스를 사용하여 파티션 평가

사전 계산 파티션이 없으면 SetupBelongs라는 프로세스가 사용됩니다. 특정 구독자에 대해 병합 에이전트가 마지막으로 실행된 후 게시자에서 필터링된 테이블의 각 변경 내용에 대해 동기화 중에 파티션 평가가 수행됩니다. 이 프로세스는 게시자와 동기화하는 모든 구독자에 대해 반복됩니다.

구독자에 대한 파티션 평가를 수행하려면 병합 에이전트는 다음 작업을 수행하는 시스템 저장 프로시저 sp_MSsetupbelongs를 호출합니다.

  1. 필터링된 각 아티클에 대해 두 개의 임시 테이블인 **#belongs_<RandomNumber>**와 **#notbelongs_<RandomNumber>**를 만듭니다.

  2. 구독자에서 SUSER_SNAME() 및/또는 HOST_NAME() 함수가 반환한 값을 사용하여 시스템 뷰를 쿼리합니다. 이 쿼리는 MSmerge_contents 또는 MSmerge_tombstone의 행이 구독자의 파티션과 관련이 있는지를 확인하는 데 사용됩니다.

  3. 행이 구독자와 관련이 없으면(예: 다른 파티션에 대한 삽입) 이 행에 대한 메타데이터는 #belongs 또는 #notbelongs에 저장되지 않습니다. 행이 관련이 있으면 다음 두 가지 결과가 발생할 수 있습니다.

    • #belongs에 행 추가. MSmerge_contents의 행이 해당 파티션에 속하는 삽입이거나 MSmerge_contents의 행이 필터링에 사용된 모든 열의 값을 변경하지 않는 업데이트인 경우에 추가됩니다.

    • #notbelongs에 행 추가. MSmerge_contents의 행이 필터링에 사용된 열의 값을 변경하는 업데이트(즉, 행을 새 파티션으로 이동)이거나 MSmerge_tombstone의 행이 해당 파티션의 행 삭제를 나타내는 경우에 추가됩니다.

[!참고]

사전 계산 파티션을 사용할 수 있어도 다른 구독이 변경 내용을 받기 시작한 후 구독이 만들어진 경우에는 해당 구독이 처음 동기화할 때 SetupBelongs 프로세스가 사용됩니다.