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

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

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

  • 하나의 파티션에 속하며 하나의 구독자(매개 변수3sp_addmergearticle 값)에 @partition_options 만 복제됩니다. 예를 들어, AdventureWorks2025 데이터베이스에서 Employee 테이블을 WHERE Employee.LoginID = SUSER_SNAME() 조건을 사용하여 필터링할 수 있습니다. 각 로그인 ID와 일치하는 행은 하나의 구독자에게만 전송됩니다.

  • 하나의 파티션에 속하고 2의 값으로 두 명 이상의 구독자에게 @partition_options로 복제됩니다. 예를 들어, AdventureWorks2025 데이터베이스에서 Products 테이블을 WHERE Products.ProductLine = HOST_NAME() 조건을 사용하여 필터링할 수 있습니다. HOST_NAME() 값은 산악 자전거 판매를 담당하는 영업 사원 그룹이 ProductLine 열에서 값이 "M"인 모든 행을 받을 수 있도록 재정의됩니다. ProductLine 열에서 값이 "M"인 각 행은 하나의 파티션에만 속하지만 여러 구독자에게 전송됩니다. 사용에 HOST_NAME()대한 자세한 내용은 HOST_NAME()를 사용한 필터링을 참조하세요.

  • 둘 이상의 파티션에 속하며 0의 경우 1 또는 @partition_options으로 둘 이상의 구독자에 배포됩니다. 예를 들어, AdventureWorks2025 데이터베이스에서 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 또는 게시 속성 대화 상자의 Data Partitions 페이지를 통해 정의됩니다.

  • 구독자가 동기화될 때, MSmerge_partition_groups에 아직 항목이 없는 파티션이 필요한 경우 자동으로 생성됩니다.

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

  • MSmerge_current_partition_mappings에는 MSmerge_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에 삽입됩니다.

      비고

      파티션당 하나의 구독(매개 변수 값3)이 있는 오버오버를 수행하지 않는 파티션을 사용하는 경우 각 행이 하나의 파티션에 sp_addmergearticle 만 속하며 @partition_options 하나의 구독자에서만 변경할 수 있으므로 시스템 테이블 MSmerge_current_partition_mappings 은 행의 파티션 매핑을 추적하는 데 사용되지 MSmerge_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 프로세스가 사용됩니다.