Aprimorar o desempenho de replicação de mesclagemEnhance Merge Replication Performance

APLICA-SE A: simSQL Server nãoBanco de Dados SQL do Azure nãoSQL Data Warehouse do Azure nãoParallel Data Warehouse APPLIES TO: yesSQL Server noAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Após considerar as dicas para o desempenho geral descritas em Aprimorando o Desempenho Geral da Replicação, considere estas áreas adicionais específicas da replicação de mesclagem.After considering the general performance tips described in Enhancing General Replication Performance, consider these additional areas specific to merge replication.

Design de banco de dadosDatabase Design

  • Colunas de índice usadas em filtros de linha e filtros de junção.Index columns used in row filters and join filters.

    Quando usar um filtro de linha em um artigo publicado, crie um índice em cada uma das colunas usadas na cláusula WHERE do filtro.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. Sem um índice, o MicrosoftMicrosoft SQL ServerSQL Server tem de ler cada linha da tabela para determinar se a linha deverá ser incluída na partição.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. Com um índice, o SQL ServerSQL Server consegue localizar rapidamente quais as linhas que deverão ser incluídas.With an index, SQL ServerSQL Server can quickly locate which rows should be included. O processamento mais rápido ocorre se a replicação conseguir resolver inteiramente a cláusula WHERE do filtro do índice de modo autônomo.The fastest processing takes place if replication can fully resolve the WHERE clause of the filter from the index alone.

    Indexar todas as colunas usadas em filtros de junção também é importante.Indexing all the columns used in join filters is also important. Cada vez que o Merge Agent é executado, ele pesquisa a tabela base para determinar quais as linhas da tabela pai e quais as linhas nas tabelas relacionadas estão incluídas na partição.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. Criar um índice em colunas unidas evita que o SQL ServerSQL Server precise ler cada linha da tabela todas as vezes que o Merge Agent for executado.Creating an index on the joined columns avoids having SQL ServerSQL Server read each row in the table every time the Merge Agent runs.

    Para mais informações sobre filtragem, consulte Filtrar dados publicados para replicação de mesclagem.For more information on filtering, see Filter Published Data for Merge Replication.

  • Considere tabelas supernormalizadas que incluam tipos de dados LOB (Large Object).Consider overnormalizing tables that include Large Object (LOB) data types.

    Quando a sincronização ocorre, o Merge Agent poderá precisar ler e transferir a linha de dados inteira de um Publicador ou Assinante.When synchronization occurs, the Merge Agent might need to read and transfer the entire data row from a Publisher or Subscriber. Se a linha contiver colunas que usam LOBs, esse processo poderá precisar alocar memória adicional e comprometer o desempenho negativamente, embora essas colunas possam não ter sido atualizadas.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. Para reduzir a probabilidade de ocorrer esse comprometimento no desempenho, considere colocar colunas LOB em uma tabela separada, usando uma relação um para um no resto dos dados de linha.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. Os tipos de dados text, ntexte image são preteridos.The data types text, ntext, and image are deprecated. Se incluir LOBs, recomendamos o uso dos tipos de dados varchar(max), nvarchar(max), varbinary(max), respectivamente.If you do include LOBs, we recommend that you use the data types varchar(max), nvarchar(max), varbinary(max), respectively.

Design de publicaçãoPublication Design

  • Use um nível de compatibilidade de publicação de 90RTM (SQL Server 2005 (9.x)SQL Server 2005 (9.x) ou uma versão posterior).Use a publication compatibility level of 90RTM (SQL Server 2005 (9.x)SQL Server 2005 (9.x) or a later version).

    Exceto se um ou mais Assinantes usarem uma versão diferente do SQL ServerSQL Server, especifique que a publicação deve oferecer suporte somente para o SQL Server 2005 (9.x)SQL Server 2005 (9.x) ou para uma versão posterior.Unless one or more Subscribers use a different version of SQL ServerSQL Server, specify that the publication must support only SQL Server 2005 (9.x)SQL Server 2005 (9.x) or a later version. Isso permite à publicação beneficiar-se de novos recursos e otimizações de desempenho.This allows the publication to take advantage of new features and performance optimizations.

  • Use as configurações de retenção da publicação apropriadas.Use appropriate publication retention settings.

    O período de retenção da publicação, que é a quantidade máxima de tempo antes que a assinatura tenha de ser sincronizada, determina por quanto tempo os metadados de controle são armazenados.The publication retention period, which is the maximum amount of time before a subscription must be synchronized, determines how long tracking metadata is stored. Um valor alto pode afetar armazenamento e o desempenho do processamento.A high value can affect storage and processing performance. Para obter mais informações sobre como definir o período de retenção de publicação, consulte Subscription Expiration and Deactivation.For more information about setting the publication retention period, see Subscription Expiration and Deactivation.

  • Use artigos de somente download nessas tabelas que só são alteradas no Publicador.Use download-only articles on those tables that are only changed at the Publisher. Para obter mais informações, consulte Optimize Merge Replication Performance with Download-Only Articles (Otimizar o desempenho da replicação de mesclagem com artigos somente para download).For more information, see Optimize Merge Replication Performance with Download-Only Articles.

Design e uso de filtroFilter Design and Use

  • Limite a complexidade das cláusulas de filtro de linha.Limit the complexity of row filter clauses.

    Limitar a complexidade dos critérios de filtragem ajuda a melhorar o desempenho, quando o Merge Agent estiver avaliando alterações de linha para enviar aos Assinantes.Limiting the complexity of the filtering criteria helps improve performance when the Merge Agent is evaluating row changes to send to Subscribers. Evite usar subseleções em cláusulas de filtro de linha de mesclagem.Avoid using sub-selects within merge row filter clauses. Em vez disso, considere o uso de filtros de junção, normalmente mais eficientes, quando usado para particionar dados em uma tabela baseada em uma cláusula de filtro de outra tabela.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. Para mais informações sobre filtragem, consulte Filtrar dados publicados para replicação de mesclagem.For more information about filtering, see Filter Published Data for Merge Replication.

  • Use partições pré-computadas com filtros com parâmetros (esse recurso é usado por padrão).Use precomputed partitions with parameterized filters (this feature is used by default). Para obter mais informações, consulte Optimize Parameterized Filter Performance with Precomputed Partitions (Otimizar o desempenho do filtro parametrizado com partições pré-computadas).For more information, see Optimize Parameterized Filter Performance with Precomputed Partitions.

    Partições pré-computadas impõem vários limites no comportamento de filtragem.Precomputed partitions impose a number of limits on filtering behavior. Se seu aplicativo não puder aderir a essas limitações, defina a opção keep_partition_changes como True, fornecendo um benefício de desempenho.If your application cannot adhere to these limitations, set the keep_partition_changes option to True, which provides a performance benefit. Para obter mais informações, consulte Filtros de linha com parâmetros.For more information, see Parameterized Row Filters.

  • Use partições não sobrepostas se os dados forem filtrados, mas não forem compartilhados entre os usuários.Use nonoverlapping partitions if data is filtered but not shared among users.

    A replicação pode aperfeiçoar o desempenho para obter dados que não são compartilhados entre as partições ou assinaturas.Replication can optimize performance for data that is not shared between partitions or subscriptions. Para obter mais informações, consulte Filtros de linha com parâmetros.For more information, see Parameterized Row Filters.

  • Não crie hierarquias de filtro de junção complexas.Do not create complex join filter hierarchies.

    Filtros de junção com cinco ou mais tabelas podem comprometer o desempenho significativamente durante o processamento de mesclagem.Join filters with five or more tables can significantly impact performance during merge processing. Se você estiver gerando filtros de junção de cinco ou mais tabelas, recomendamos que considere outras soluções:We recommend that if you are generating join filters of five or more tables that you consider other solutions:

    • Evite tabelas de filtragem que são, em sua maioria, tabelas de pesquisa, tabelas menores e tabelas que não estão sujeitas às alterações.Avoid filtering tables that are primarily lookup tables, smaller tables, and tables that are not subject to change. Torne essas tabelas parte da publicação na sua totalidade.Make those tables part of the publication in their entirety. Recomendamos que você use filtros de junção apenas entre as tabelas que devem ser particionadas entre os Assinantes.We recommend that you use join filters only between tables that must be partitioned among Subscribers. Para obter mais informações, consulte Join Filters.For more information, see Join Filters.

    • Considere a desnormalização do design do banco de dados ou o uso de uma tabela de mapeamento, se houver um grande número de tabelas em uma junção.Consider denormalizing the database design or using a mapping table if there are a large number of tables in a join. Por exemplo, se um vendedor necessita apenas dos dados de seus clientes, mas precisa de seis junções para associar um cliente ao vendedor, considere a adição de uma coluna à tabela do cliente, identificando o vendedor.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. Os dados do vendedor são redundantes, mas os custos de desnormalização de tabelas podem ser compensados pelos benefícios de desempenho para o particionamento de replicação.The sales person data is redundant, but the costs of denormalizing the tables somewhat might be outweighed by the performance benefits for replication partitioning.

    • Para melhorar o desempenho de partições pré-computadas, quando os lotes contêm muitas alterações de dados, projete seu aplicativo com atenção.To improve the performance of precomputed partitions when batches contain lots of data changes, design your application with care. Assegure-se de que as alterações de dados na tabela pai em um filtro de junção sejam feitas antes das alterações correspondentes nas tabelas filho.Make sure that changes to data in the parent table in a join filter are made before corresponding changes in the child tables.

  • Defina a opção join_unique_key como 1 , se a lógica permitir.Set the join_unique_key option to 1 if logic allows.

    Definir esse parâmetro como 1 indica que a relação entre tabelas pai e filho, em um filtro de junção, é de um para um ou de um para muitos.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. Selecione esse parâmetro como 1 , apenas se houver uma restrição na coluna de junção na tabela filho garantindo a exclusividade.Only set this parameter to 1 if you have a constraint on the joining column in the child table that guarantees uniqueness. Se o parâmetro for definido incorretamente como 1 , poderá ocorrer a não convergência dos dados.If the parameter is set to 1 incorrectly, non-convergence of data can occur. Para obter mais informações, consulte Join Filters.For more information, see Join Filters.

  • Evite executar lotes com muitas alterações quando você usar partições pré-computadas.Avoid executing batches with lots of changes when you use precomputed partitions.

    Quando o Merge Agent é executado depois que você executou um lote, contendo lotes de alterações de dados, o agente tenta dividir o lote maior em lotes menores.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. Durante esse tempo, podem ser bloqueados outros processos do Merge Agent.During this time, other Merge Agent processes may be blocked. Considere a redução do número de alterações em um lote e execute o Merge Agent entre os lotes.Consider reducing the number of changes in a batch and run the Merge Agent between batches. Se isso não puder ser feito, aumente o valor de generation_leveling_threshold para a publicação.If this cannot be done, increase the value of generation_leveling_threshold for the publication.

Considerações sobre assinaturaSubscription Considerations

  • Divida os agendamentos de sincronização de assinatura.Stagger subscription synchronization schedules.

    Se um grande número de Assinantes sincronizarem com o Publicador, divida os agendamentos para que os Merge Agents sejam executados em momentos diferentes.If a large number of Subscribers synchronize with a Publisher, consider staggering the schedules so that Merge Agents run at different times. Para obter mais informações, consulte Specify Synchronization Schedules.For more information, see Specify Synchronization Schedules.

Parâmetros do Merge AgentMerge Agent Parameters

Para obter informações sobre o Merge Agent e seus parâmetros, consulte Replication Merge Agent.For information about the Merge Agent and its parameters, see Replication Merge Agent.

  • Atualize todos os Assinantes com assinaturas pull do SQL Server 2005 (9.x)SQL Server 2005 (9.x) ou de uma versão posterior.Upgrade all Subscribers for pull subscriptions to SQL Server 2005 (9.x)SQL Server 2005 (9.x) or a later version.

    Atualizar o Assinante para o SQL Server 2005 (9.x)SQL Server 2005 (9.x) ou para uma versão posterior atualiza o Merge Agent usado pelas assinaturas do Assinante.Upgrading the Subscriber to SQL Server 2005 (9.x)SQL Server 2005 (9.x) or a later version upgrades the Merge Agent used by the subscriptions at that Subscriber. Para se beneficiar dos muitos recursos e otimizações de desempenho, é necessário o Merge Agent do SQL Server 2005 (9.x)SQL Server 2005 (9.x) ou de uma versão posterior.To take advantage of many of the new features and performance optimizations, the Merge Agent from SQL Server 2005 (9.x)SQL Server 2005 (9.x) or a later version is required.

  • Se uma assinatura for sincronizada em uma conexão rápida e as alterações forem enviadas do Publicador e do assinante, use o parâmetro –ParallelUploadDownload para o Agente de Mesclagem.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.

    OSQL Server 2005 (9.x)SQL Server 2005 (9.x) introduziu um novo parâmetro no Agente de Mesclagem: –ParallelUploadDownload.SQL Server 2005 (9.x)SQL Server 2005 (9.x) introduced a new Merge Agent parameter: –ParallelUploadDownload. Definir esse parâmetro permite ao Merge Agent processar em paralelo as mudanças carregadas no Publicador e as baixadas no Assinante.Setting this parameter allows the Merge Agent to process in parallel the changes uploaded to the Publisher and those downloaded to the Subscriber. É útil em ambientes com grandes volumes e largura de banda de rede alta.This is useful in high volume environments with high network bandwidth. Os parâmetros de agente podem ser especificados em perfis de agente e na linha de comando.Agent parameters can be specified in agent profiles and on the command line. Para obter mais informações, consulte:For more information, see:

  • Considere aumentar o valor do parâmetro -MakeGenerationInterval , especialmente se a sincronização envolver mais carregamentos de Assinantes do que downloads para Assinantes.Consider increasing the value of the -MakeGenerationInterval parameter, especially if synchronization involves more uploads from Subscribers than downloads to Subscribers.

  • Quando sincronizar linhas de dados com um grande volume de dados, como linhas com colunas LOB, a sincronização da Web poderá necessitar de alocação de memória adicional e prejudicar o desempenho.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. Isso ocorre quando o Merge Agent gera uma mensagem XML contendo muitas linhas, com um grande volume de dados.This occurs when the Merge Agent generates an XML message that contains too many data rows with large amounts of data. Se o Merge Agent estiver consumindo muitos recursos durante a sincronização da Web, reduza o número de linhas enviadas em uma única mensagem, usando uma das seguintes opções: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 o perfil do agente de vínculo lento para o Merge Agent.Use the slow link agent profile for the Merge Agent. Para obter mais informações, consulte Replication Agent Profiles.For more information, see Replication Agent Profiles.

    • Diminua os parâmetros - DownloadGenerationsPerBatch e - UploadGenerationsPerBatch do Agente de Mesclagem para um valor menor ou igual a 10.Decrease the -DownloadGenerationsPerBatch and -UploadGenerationsPerBatch parameters for the Merge Agent to a value of 10 or less. O valor padrão desses parâmetros é 50.The default value of these parameters is 50.

Considerações de instantâneoSnapshot Considerations

  • Crie uma coluna ROWGUIDCOL nas tabelas grandes, antes de gerar o instantâneo inicial.Create a ROWGUIDCOL column on large tables prior to generating the initial snapshot.

    A replicação de mesclagem requer que cada tabela publicada tenha uma coluna ROWGUIDCOL.Merge replication requires that each published table have a ROWGUIDCOL column. Se a coluna ROWGUIDCOL não existir na tabela antes do Snapshot Agent criar arquivos de instantâneo inicial, o agente deve primeiro adicionar e popular a coluna 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. Para obter uma vantagem de desempenho ao gerar instantâneos, crie uma coluna ROWGUIDCOL em cada tabela antes de publicar.To gain a performance advantage when generating snapshots during merge replication, create the ROWGUIDCOL column on each table before publishing. A coluna pode ter qualquer nome (rowguid é usado pelo Snapshot Agent, por padrão), mas deve ter as seguintes características de tipos de dados:The column can have any name (rowguid is used by the Snapshot Agent by default), but must have the following data type characteristics:

    • Dados do tipo UNIQUEIDENTIFIER.A data type of UNIQUEIDENTIFIER.

    • Um padrão NEWSEQUENTIALID() ou NEWID().A default of NEWSEQUENTIALID() or NEWID(). NEWSEQUENTIALID() é o recomendado, pois pode fornecer um desempenho melhor ao fazer e controlar alterações.NEWSEQUENTIALID() is recommended because it can provide increased performance when making and tracking changes.

    • O conjunto de propriedades ROWGUIDCOL.The ROWGUIDCOL property set.

    • Um índice exclusivo na coluna.A unique index on the column.

  • Gere os instantâneos previamente e/ou permita que os Assinantes solicitem a geração e a aplicação de instantâneos, na primeira vez que fizerem a sincronização.Pre-generate snapshots and/or allow Subscribers to request snapshot generation and application the first time they synchronize.

    Use uma, ou ambas as opções, para fornecer instantâneos para publicações que usam filtros com parâmetros.Use one or both of these options to provide snapshots for publications that use parameterized filters. Se você não especificar uma dessas opções, as assinaturas serão inicializadas usando uma série de instruções SELECT e INSERT, ao invés de usar o utilitário bcp , esse processo é muito mais lento.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. Para obter mais informações, consulte Snapshots for Merge Publications with Parameterized Filters.For more information, see Snapshots for Merge Publications with Parameterized Filters.

Considerações sobre manutenção e monitoramentoMaintenance and Monitoring Considerations

  • Esporadicamente, indexe novamente as tabelas do sistema de replicação de mesclagem.Occasionally re-index merge replication system tables.

    Como parte da manutenção para replicação de mesclagem, verifique ocasionalmente o crescimento das tabelas do sistema associado à replicação de mesclagem: MSmerge_contents, MSmerge_genhistory e MSmerge_tombstone, MSmerge_current_partition_mappings e MSmerge_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. Periodicamente, indexe novamente essas tabelas.Periodically re-index these tables. Para obter mais informações, veja Reorganizar e recriar índices.For more information, see Reorganize and Rebuild Indexes.

  • Monitore o desempenho de sincronização usando a guia Histórico de Sincronização no Replication Monitor.Monitor synchronization performance using the Synchronization History tab in Replication Monitor.

    Para a replicação de mesclagem, o Replication Monitor exibe as estatísticas detalhadas na guia Histórico de Sincronizações para cada artigo processado durante a sincronização, incluindo tempo gasto em cada fase do processamento (carregar alterações, baixar alterações e assim por diante).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). Ajuda a definir tabelas específicas que estão causando lentidão e é o melhor local para a solução de problemas de desempenho com assinaturas de mesclagem.It can help pinpoint specific tables that are causing slow downs and is the best place to troubleshoot performance issues with merge subscriptions. Para obter mais informações sobre como exibir estatísticas detalhadas, confira Exibir informações e executar tarefas usando o Replication Monitor.For more information on viewing detailed statistics, see View information and perform tasks using Replication Monitor.