병합 복제 성능 향상Enhance Merge Replication Performance

일반적인 복제 성능 향상에서 설명하는 일반적인 성능 팁을 고려한 후 병합 복제에 대한 다음 영역을 추가로 고려해 보십시오.After considering the general performance tips described in Enhancing General Replication Performance, consider these additional areas specific to merge replication.

데이터베이스 디자인Database Design

  • 행 필터 및 조인 필터에 사용된 열을 인덱싱합니다.Index columns used in row filters and join filters.

    게시된 아티클에 행 필터를 사용하는 경우 필터의 WHERE 절에 사용되는 각 열에 인덱스를 만듭니다.When you use a row filter on a published article, create an index on each of the columns that is used in the filter's WHERE clause. 인덱스가 없으면 MicrosoftMicrosoft SQL ServerSQL Server 에서는 테이블의 각 행을 읽은 후 해당 행을 파티션에 포함할 것인지 여부를 결정합니다.Without an index, MicrosoftMicrosoft SQL ServerSQL Server has to read each row in the table to determine whether the row should be included in the partition. 인덱스가 있다면 SQL ServerSQL Server 는 어떤 행을 포함해야 하는지를 빨리 찾을 수 있습니다.With an index, SQL ServerSQL Server can quickly locate which rows should be included. 복제가 인덱스에서만 필터의 WHERE 절을 모두 확인하면 가장 빠른 처리가 이루어집니다.The fastest processing takes place if replication can fully resolve the WHERE clause of the filter from the index alone.

    조인 필터에 사용되는 모든 열에 인덱스를 만드는 것도 중요합니다.Indexing all the columns used in join filters is also important. 병합 에이전트는 실행될 때마다 기본 테이블의 어떤 열과 관련 테이블의 어떤 열을 파티션에 포함할 것인지를 결정하기 위해 부모 테이블을 검색합니다.Each time the Merge Agent runs, it searches the base table to determine which rows in a parent table and which rows in related tables are included in a partition. 조인된 열에 인덱스를 만들면 SQL ServerSQL Server 에서는 병합 에이전트가 실행될 때마다 테이블의 각 행을 읽지 않아도 됩니다.Creating an index on the joined columns avoids having SQL ServerSQL Server read each row in the table every time the Merge Agent runs.

    필터링에 대한 자세한 내용은 병합 복제의 게시된 데이터 필터링을 참조하세요.For more information on filtering, see Filter Published Data for Merge Replication.

  • LOB(Large Object) 데이터 형식을 포함하는 테이블을 너무 많이 정규화한 경우를 고려해 보십시오.Consider overnormalizing tables that include Large Object (LOB) data types.

    동기화가 발생할 때 병합 에이전트는 게시자 또는 구독자에서 전체 데이터 행을 읽고 전송해야 합니다.When synchronization occurs, the Merge Agent might need to read and transfer the entire data row from a Publisher or Subscriber. 이 행에 LOB를 사용하는 열이 있다면 추가 메모리 할당이 필요하고 이러한 열이 업데이트되지 않았어도 성능에 부정적 영향을 미칠 수 있습니다.If the row contains columns that use LOBs, this process can require additional memory allocation and negatively impact performance even though these columns may not have been updated. 이렇게 성능에 미칠 영향을 줄이려면 나머지 행 데이터에 대해 일 대 일 관계를 사용하여 LOB 열을 별개의 테이블에 두도록 합니다.To reduce the likelihood that this performance impact occurs, consider putting LOB columns in a separate table using a one-to-one relationship to the rest of the row data. text, ntextimage 데이터 형식은 사용되지 않습니다.The data types text, ntext, and image are deprecated. LOB를 포함시킬 경우 데이터 형식 varchar(max), nvarchar(max), varbinary(max)를 각각 사용하는 것이 좋습니다.If you do include LOBs, we recommend that you use the data types varchar(max), nvarchar(max), varbinary(max), respectively.

게시 디자인Publication Design

  • 90RTM( SQL Server 2005SQL Server 2005 이상 버전)의 게시 호환성 수준을 사용합니다.Use a publication compatibility level of 90RTM ( SQL Server 2005SQL Server 2005 or a later version).

    하나 이상의 구독자가 동일한 버전의 SQL ServerSQL Server를 사용하면 게시에서 SQL Server 2005SQL Server 2005 이상 버전만 지원하도록 지정합니다.Unless one or more Subscribers use a different version of SQL ServerSQL Server, specify that the publication must support only SQL Server 2005SQL Server 2005 or a later version. 이렇게 하면 게시에서 새로운 기능과 성능 최적화를 사용할 수 있습니다.This allows the publication to take advantage of new features and performance optimizations.

  • 적절한 게시 보존 설정을 사용합니다.Use appropriate publication retention settings.

    구독이 동기화되기 전까지의 최대 시간을 나타내는 게시 보존 기간은 추적 메타데이터가 저장되는 기간을 결정합니다.The publication retention period, which is the maximum amount of time before a subscription must be synchronized, determines how long tracking metadata is stored. 값이 높으면 저장소 및 처리 성능에 영향을 줄 수 있습니다.A high value can affect storage and processing performance. 게시 보존 기간을 설정하는 방법은 Subscription Expiration and Deactivation를 참조하십시오.For more information about setting the publication retention period, see Subscription Expiration and Deactivation.

  • 게시자에서만 변경되는 테이블의 다운로드 전용 아티클을 사용합니다.Use download-only articles on those tables that are only changed at the Publisher. 자세한 내용은 다운로드 전용 아티클로 병합 복제 성능 최적화를 참조하세요.For more information, see Optimize Merge Replication Performance with Download-Only Articles.

필터 디자인 및 사용Filter Design and Use

  • 행 필터 절의 복잡도를 제한합니다.Limit the complexity of row filter clauses.

    필터링 조건의 복잡도를 제한하면 병합 에이전트가 구독자로 보낼 행 변경 내용을 평가할 때 성능을 향상시킬 수 있습니다.Limiting the complexity of the filtering criteria helps improve performance when the Merge Agent is evaluating row changes to send to Subscribers. 병합 행 필터 절에 하위 선택을 사용하지 않도록 합니다.Avoid using sub-selects within merge row filter clauses. 대신 다른 테이블의 행 필터 절을 기반으로 하는 한 테이블에서 데이터를 보다 효율적으로 분할할 수 있는 조인 필터의 사용을 고려합니다.Instead, consider using join filters, which are generally more efficient when used to partition data in one table based on the row filter clause in another table. 필터링에 대한 자세한 내용은 병합 복제의 게시된 데이터 필터링을 참조하세요.For more information about filtering, see Filter Published Data for Merge Replication.

  • 매개 변수가 있는 필터와 함께 사전 계산 파티션을 사용합니다. 이 기능은 기본적으로 사용됩니다.Use precomputed partitions with parameterized filters (this feature is used by default). 자세한 내용은 사전 계산 파티션으로 매개 변수가 있는 필터 성능 최적화를 참조하세요.For more information, see Optimize Parameterized Filter Performance with Precomputed Partitions.

    사전 계산 파티션은 여러 가지 필터링 동작을 제한합니다.Precomputed partitions impose a number of limits on filtering behavior. 응용 프로그램이 이러한 제한 사항을 따를 수 없는 경우 keep_partition_changes 옵션을 True로 설정하면 성능상 이점이 있습니다.If your application cannot adhere to these limitations, set the keep_partition_changes option to True, which provides a performance benefit. 자세한 내용은 Parameterized Row Filters를 참조하세요.For more information, see Parameterized Row Filters.

  • 데이터가 필터링되었지만 사용자 간에 공유되지 않으면 겹치지 않는 파티션을 사용합니다.Use nonoverlapping partitions if data is filtered but not shared among users.

    복제에서는 파티션 또는 구독 간에 공유되지 않는 데이터의 성능을 최적화할 수 있습니다.Replication can optimize performance for data that is not shared between partitions or subscriptions. 자세한 내용은 Parameterized Row Filters를 참조하세요.For more information, see Parameterized Row Filters.

  • 복잡한 조인 필터 계층을 만들지 않습니다.Do not create complex join filter hierarchies.

    5개 이상의 테이블을 가진 조인 필터는 병합 처리 중 성능에 크게 영향을 줄 수 있습니다.Join filters with five or more tables can significantly impact performance during merge processing. 5개 이상의 테이블을 가진 조인 필터를 생성하는 경우 다른 해결책을 고려하는 것이 좋습니다.We recommend that if you are generating join filters of five or more tables that you consider other solutions:

    • 주로 조회 테이블, 작은 테이블 및 변경이 필요하지 않은 테이블로 구성된 테이블은 필터링하지 않습니다.Avoid filtering tables that are primarily lookup tables, smaller tables, and tables that are not subject to change. 이러한 테이블을 전체적으로 게시의 일부로 만듭니다.Make those tables part of the publication in their entirety. 구독자 간에 분할되어야 하는 테이블 사이에만 조인 필터를 사용하는 것이 좋습니다.We recommend that you use join filters only between tables that must be partitioned among Subscribers. 자세한 내용은 Join Filters를 참조하세요.For more information, see Join Filters.

    • 조인에 테이블이 많은 경우 데이터베이스 디자인을 비정규화하거나 매핑 테이블을 사용할 것을 고려합니다.Consider denormalizing the database design or using a mapping table if there are a large number of tables in a join. 예를 들어 영업 사원은 자신의 고객에 대한 데이터만 필요한 경우 고객을 영업 사원과 연결하기 위해 6개의 조인이 필요하다면 영업 사원을 식별하는 customer 테이블에 열을 추가할 것을 고려합니다.For example, if a sales person needs only the data for her customers, but it requires six joins to associate a customer with a sales person, consider adding a column to the customer table that identifies the sales person. 영업 사원 데이터는 중복되지만 복제를 분할하는 것이 해당 테이블을 비정규화하는 것보다 성능상 이점이 있습니다.The sales person data is redundant, but the costs of denormalizing the tables somewhat might be outweighed by the performance benefits for replication partitioning.

    • 일괄 처리에 많은 데이터 변경 사항이 있을 때 사전 계산 파티션의 성능을 향상시키기 위해 신중하게 응용 프로그램을 디자인합니다.To improve the performance of precomputed partitions when batches contain lots of data changes, design your application with care. 조인 필터에서 부모 테이블의 데이터 변경은 자식 테이블의 해당 데이터 변경보다 먼저 수행되어야 합니다.Make sure that changes to data in the parent table in a join filter are made before corresponding changes in the child tables.

  • 논리에 맞는 경우 join_unique_key 옵션을 1 로 설정합니다.Set the join_unique_key option to 1 if logic allows.

    이 매개 변수를 1 로 설정하면 조인 필터에서 자식 테이블과 부모 테이블 사이의 관계가 일 대 일 또는 일 대 다가 됩니다.Setting this parameter to 1 indicates that the relationship between the child and parent tables in a join filter is one to one or one to many. 자식 테이블의 조인 열에 고유성을 보장하는 제약 조건이 있는 경우에만 이 매개 변수를 1 로 설정하십시오.Only set this parameter to 1 if you have a constraint on the joining column in the child table that guarantees uniqueness. 그렇지 않은 경우에 이 매개 변수를 1 로 설정하면 데이터가 일치하지 않을 수 있습니다.If the parameter is set to 1 incorrectly, non-convergence of data can occur. 자세한 내용은 Join Filters를 참조하세요.For more information, see Join Filters.

  • 사전 계산 파티션을 사용하는 경우 많은 변경 사항이 있는 일괄 처리를 실행하지 않도록 합니다.Avoid executing batches with lots of changes when you use precomputed partitions.

    많은 데이터 변경 사항이 있는 일괄 처리를 실행한 후 병합 에이전트를 실행하면 이 에이전트에서 큰 일괄 처리를 여러 개의 작은 일괄 처리로 나눕니다.When the Merge Agent is run after you run a batch that contains lots of data changes, the agent tries to divide the large batch into smaller batches. 이 시간 동안 다른 병합 에이전트 프로세스는 차단될 수 있습니다.During this time, other Merge Agent processes may be blocked. 일괄 처리의 변경 사항 수를 줄이고 일괄 처리 사이에 병합 에이전트를 실행하십시오.Consider reducing the number of changes in a batch and run the Merge Agent between batches. 이렇게 할 수 없으면 게시에 대한 generation_leveling_threshold 값을 늘립니다.If this cannot be done, increase the value of generation_leveling_threshold for the publication.

구독 고려 사항Subscription Considerations

  • 구독 동기화 일정은 엇갈리게 설정합니다.Stagger subscription synchronization schedules.

    많은 구독자가 게시자와 동기화하는 경우 각각의 병합 에이전트가 서로 다른 시간에 실행되도록 일정을 엇갈리게 설정해 봅니다.If a large number of Subscribers synchronize with a Publisher, consider staggering the schedules so that Merge Agents run at different times. 자세한 내용은 Specify Synchronization Schedules을 참조하세요.For more information, see Specify Synchronization Schedules.

병합 에이전트 매개 변수Merge Agent Parameters

병합 에이전트와 해당 매개 변수에 대한 자세한 내용은 Replication Merge Agent를 참조하십시오.For information about the Merge Agent and its parameters, see Replication Merge Agent.

  • 끌어오기 구독에 대한 모든 구독자를 SQL Server 2005SQL Server 2005 이상 버전으로 업그레이드합니다.Upgrade all Subscribers for pull subscriptions to SQL Server 2005SQL Server 2005 or a later version.

    구독자를 SQL Server 2005SQL Server 2005 이상 버전으로 업그레이드하면 해당 구독자의 구독에서 사용한 병합 에이전트가 업그레이드됩니다.Upgrading the Subscriber to SQL Server 2005SQL Server 2005 or a later version upgrades the Merge Agent used by the subscriptions at that Subscriber. 여러 가지 새로운 기능과 성능 최적화를 사용하려면 SQL Server 2005SQL Server 2005 이상 버전의 병합 에이전트가 필요합니다.To take advantage of many of the new features and performance optimizations, the Merge Agent from SQL Server 2005SQL Server 2005 or a later version is required.

  • 구독이 빠른 연결을 통해 동기화되고 게시자에서 구독자로 변경 내용이 전송되면 병합 에이전트에 대해 –ParallelUploadDownload 매개 변수를 사용합니다.If a subscription is synchronized over a fast connection and changes are sent from the Publisher and Subscriber, use the –ParallelUploadDownload parameter for the Merge Agent.

    SQL Server 2005SQL Server 2005 에서는 새로운 병합 에이전트 매개 변수인 –ParallelUploadDownload가 도입되었습니다. introduced a new Merge Agent parameter: –ParallelUploadDownload. 이 매개 변수를 설정하면 병합 에이전트가 게시자로 업로드되는 변경 내용과 구독자로 다운로드되는 변경 내용을 병렬로 처리할 수 있습니다.Setting this parameter allows the Merge Agent to process in parallel the changes uploaded to the Publisher and those downloaded to the Subscriber. 이것은 네트워크 대역폭이 높은 대규모 환경에서 유용합니다.This is useful in high volume environments with high network bandwidth. 에이전트 프로필 및 명령줄에서 에이전트 매개 변수를 지정할 수 있습니다.Agent parameters can be specified in agent profiles and on the command line. 참조 항목:For more information, see:

  • 특히 동기화할 때 구독자로부터의 업로드와 구독자로의 다운로드가 더 많이 필요한 경우 -MakeGenerationInterval 매개 변수의 값을 늘릴 것을 고려합니다.Consider increasing the value of the -MakeGenerationInterval parameter, especially if synchronization involves more uploads from Subscribers than downloads to Subscribers.

  • LOB 열이 있는 행처럼 많은 양의 데이터가 있는 데이터 행을 동기화할 때는 웹 동기화에 추가 메모리 할당이 필요하고 성능이 저하될 수 있습니다.When you synchronize data rows with a large amount of data, such as rows with LOB columns, Web synchronization can require additional memory allocation and hurt performance. 병합 에이전트에서 대량의 데이터가 있는 데이터 행을 너무 많이 포함한 XML 메시지를 생성하는 경우 이러한 현상이 발생합니다.This occurs when the Merge Agent generates an XML message that contains too many data rows with large amounts of data. 병합 에이전트가 웹 동기화 중에 너무 많은 리소스를 소비하는 경우 다음 중 한 가지 방법으로 단일 메시지에 보내는 행 수를 줄이십시오.If the Merge Agent is consuming too many resources during Web synchronization, reduce the number of rows sent in a single message in one of the following ways:

    • 병합 에이전트에 느린 연결 에이전트 프로필을 사용합니다.Use the slow link agent profile for the Merge Agent. 자세한 내용은 Replication Agent Profiles을 참조하세요.For more information, see Replication Agent Profiles.

    • 병합 에이전트의 경우 -DownloadGenerationsPerBatch-UploadGenerationsPerBatch 매개 변수를 10 이하의 값으로 줄입니다.Decrease the -DownloadGenerationsPerBatch and -UploadGenerationsPerBatch parameters for the Merge Agent to a value of 10 or less. 이들 매개 변수의 기본값은 50입니다.The default value of these parameters is 50.

스냅숏 고려 사항Snapshot Considerations

  • 초기 스냅숏을 생성하기 전에 대형 테이블에 ROWGUIDCOL 열을 만듭니다.Create a ROWGUIDCOL column on large tables prior to generating the initial snapshot.

    병합 복제에서 게시된 각 테이블은 ROWGUIDCOL 열을 가져야 합니다.Merge replication requires that each published table have a ROWGUIDCOL column. 스냅숏 에이전트가 초기 스냅숏 파일을 만들기 전에 ROWGUIDCOL 열이 테이블에 없다면 에이전트는 우선 ROWGUIDCOL 열을 추가하고 채워야 합니다.If a ROWGUIDCOL column does not exist in the table before the Snapshot Agent creates the initial snapshot files, the agent must first add and populate the ROWGUIDCOL column. 병합 복제 중 스냅숏을 생성할 때 성능을 향상시키려면 게시하기 전 각 테이블에 ROWGUIDCOL 열을 만듭니다.To gain a performance advantage when generating snapshots during merge replication, create the ROWGUIDCOL column on each table before publishing. 이 열은 어떤 이름도 가질 수 있지만(기본적으로 스냅숏 에이전트는rowguid 를 사용) 다음 데이터 형식 특징이 있어야 합니다.The column can have any name (rowguid is used by the Snapshot Agent by default), but must have the following data type characteristics:

    • UNIQUEIDENTIFIER 데이터 형식A data type of UNIQUEIDENTIFIER.

    • NEWSEQUENTIALID() 또는 NEWID()의 기본값.A default of NEWSEQUENTIALID() or NEWID(). NEWSEQUENTIALID()는 변경을 수행하고 추적할 때 성능을 향상시킬 수 있으므로 사용하는 것이 좋습니다.NEWSEQUENTIALID() is recommended because it can provide increased performance when making and tracking changes.

    • ROWGUIDCOL 속성 집합The ROWGUIDCOL property set.

    • 열에 있는 고유 인덱스A unique index on the column.

  • 스냅숏을 미리 생성하거나 구독자가 처음 동기화될 때 스냅숏의 생성과 적용을 요청하도록 합니다.Pre-generate snapshots and/or allow Subscribers to request snapshot generation and application the first time they synchronize.

    이러한 옵션 중 하나 또는 둘 모두를 사용하여 매개 변수가 있는 필터를 사용하는 게시에 대한 스냅숏을 제공할 수 있습니다.Use one or both of these options to provide snapshots for publications that use parameterized filters. 이러한 옵션을 하나도 지정하지 않으면 bcp 유틸리티를 사용하지 않고 일련의 SELECT 및 INSERT 문을 사용하여 구독을 초기화하게 되는데 이 경우 프로세스의 속도가 훨씬 느립니다.If you do not specify one of these options, subscriptions are initialized using a series of SELECT and INSERT statements, rather than using the bcp utility; this process is much slower. 자세한 내용은 Snapshots for Merge Publications with Parameterized Filters을 참조하세요.For more information, see Snapshots for Merge Publications with Parameterized Filters.

유지 관리 및 모니터링 고려 사항Maintenance and Monitoring Considerations

  • 병합 복제 시스템 테이블의 인덱스를 가끔씩 다시 만듭니다.Occasionally re-index merge replication system tables.

    병합 복제 유지 관리의 한 부분으로 병합 복제와 연결된 MSmerge_contents, MSmerge_genhistoryMSmerge_tombstone, MSmerge_current_partition_mappingsMSmerge_past_partition_mappings시스템 테이블의 증가를 확인하십시오.As part of maintenance for merge replication, occasionally check the growth of the system tables associated with merge replication: MSmerge_contents, MSmerge_genhistory, and MSmerge_tombstone, MSmerge_current_partition_mappings, and MSmerge_past_partition_mappings. 이러한 테이블의 인덱스를 주기적으로 다시 만듭니다.Periodically re-index these tables. 자세한 내용은 인덱스 다시 구성 및 다시 작성을 참조하세요.For more information, see Reorganize and Rebuild Indexes.

  • 복제 모니터의 동기화 기록 탭을 사용하여 동기화 성능을 모니터링합니다.Monitor synchronization performance using the Synchronization History tab in Replication Monitor.

    병합 복제의 경우 복제 모니터는 각 처리 단계(변경 내용 업로드, 변경 내용 다운로드 등)에 소요된 시간을 포함하여 동기화 중에 처리된 각 아티클에 대한 자세한 통계를 동기화 기록 탭에 표시합니다.For merge replication, Replication Monitor displays detailed statistics in the Synchronization History tab for each article processed during synchronization, including the amount of time spent in each processing phase (uploading changes, downloading changes, and so on). 이 통계는 속도 저하의 원인이 되고 병합 구독의 성능 문제를 해결하기에 가장 적합한 특정 테이블을 정확히 찾아내는 데 도움이 될 수 있습니다.It can help pinpoint specific tables that are causing slow downs and is the best place to troubleshoot performance issues with merge subscriptions. 자세한 통계를 보는 방법은 구독 관련 에이전트에 대한 정보 보기 및 태스크 수행(복제 모니터)을 참조하세요.For more information on viewing detailed statistics, see View Information and Perform Tasks for the Agents Associated With a Subscription (Replication Monitor).