Como a replicação de mesclagem avalia as partições em publicações filtradas

Quando uma ou mais tabelas em uma publicação de mesclagem for filtrada usando filtros com parâmetros e filtros de junção, os dados das tabelas publicadas são particionados. Uma partição é simplesmente um subconjunto das linhas de uma tabela. Quando um Assinante é sincronizado com um Publicador, o Publicador deve determinar quais linhas pertencem à partição de um Assinante com base nos valores que o Assinante fornece para as funções do sistemaSUSER_SNAME() e/ou HOST_NAME(). Esse processo de determinação de associação de partição de alterações no Publicador para cada Assinante recebendo um conjunto de dados filtrado é referido como avaliação de partição.

Dependendo dos dados das tabelas publicadas e das configurações escolhidas na criação de um filtro com parâmetros e de qualquer filtro de junção relacionado, cada linha de uma tabela publicada poderá:

  • Pertencer a uma partição e ser replicada a somente um Assinante (um valor de 3 para o parâmetro sp_addmergearticle@partition_options). Por exemplo, no banco de dados AdventureWorks2008R2, você pode filtrar a tabela Employee com a seguinte cláusula de filtro: WHERE Employee.LoginID = SUSER_SNAME(). A linha que corresponde a cada Logon ID é enviada somente a um Assinante.

  • Pertencer a uma partição e ser replicado a mais de um Assinante (um valor de 2 para @partition_options). Por exemplo, no banco de dados AdventureWorks2008R2, você pode filtrar a tabela Produtos com a seguinte cláusula de filtro: WHERE Products.ProductLine = HOST_NAME(). O valor HOST_NAME() é substituído de modo que o grupo de pessoal de vendas responsável pelas vendas de mountain bike receba todas as linhas com um valor "M" na coluna Linha_de_Produção; cada linha com um valor "M" pertence somente a uma partição, mas é enviada a mais de um Assinante. Para obter mais informações sobre o uso de HOST_NAME(), consulte a seção "Filtragem com HOST_NAME()" em Filtro de linha com parâmetros.

  • Pertencer a mais de uma partição e ser replicado para mais de um Assinante (um valor de 0 ou 1 para @partition_options). Por exemplo, no banco de dados AdventureWorks2008R2, você pode filtrar a tabela Produtos com a seguinte cláusula de filtro: WHERE Products.ProductLine = HOST_NAME() or Products.ListPrice < 100. Neste caso, a equipe de vendas responsável pelas vendas de mountain bike também pode vender produtos em outras categorias contanto que o preço de vendas seja inferior a $100 dólares. Por causa do OR na cláusula de filtro, a linha pode pertencer a mais de uma partição.

Como as partições são avaliadas

A avaliação de partição ocorre de duas maneiras na replicação de mesclagem, dependendo se o recurso das partições pré-computadas é utilizado. Se um número de requisitos for cumprido, novas publicações de mesclagem serão, por padrão, criadas com as partições pré-computadas habilitadas e as publicações existentes serão automaticamente atualizadas para usar o recurso. Para obter uma lista completa dos requisitos, consulte Otimizando o desempenho de filtro com parâmetros com partições pré-computadas.

Avaliação de partição com uso de partições pré-computadas

Com as partições pré-computadas, a associação de partição de todas as alterações no Publicador será pré-computada e persiste na hora em que as alterações são feitas nas tabelas publicadas. Como resultado, quando um Assinante é sincronizado com o Publicador, ele pode iniciar imediatamente a baixar as alterações relevantes a sua partição sem ter de passar pelo processo de avaliação de partição. Isso pode levar a um ganho significante de desempenho quando a publicação tem um grande número de alterações, Assinantes ou artigos na publicação.

As tabelas do sistema envolvidas na avaliação de partição pré-computada são:

  • MSmerge_partition_groups

  • MSmerge_current_partition_mappings

  • MSmerge_past_partition_mappings

A MSmerge_partition_groups contém uma linha para cada partição que está definida em uma publicação. As partições podem ser:

  • Definidas explicitamente usando sp_addmergepartition ou a página Partições de Dados da caixa de diálogo Propriedades de Publicação.

  • Criada automaticamente quando um Assinante sincroniza, se o Assinante requer uma partição que ainda não tem uma entrada na MSmerge_partition_groups.

As outras duas tabelas (MSmerge_current_partition_mappings e MSmerge_past_partition_mappings) são populadas à medida que as alterações são feitas nas tabelas publicadas. Sempre que uma alteração for feita em uma tabela publicada no banco de dados de publicação, um gatilho de mesclagem é acionado e registra os metadados:

  • A MSmerge_current_partition_mappings contém uma linha para cada combinação exclusiva de linhas em MSmerge_contents e MSmerge_partition_groups. Por exemplo, se uma linha de uma tabela de usuário pertence a duas partições, e a linha for atualizada, uma linha será inserida na MSmerge_contents para refletir a atualização e duas linhas serão inseridas na MSmerge_current_partition_mappings, para indicar que a linha atualizada pertence às duas partições.

  • A MSmerge_past_partition_mappings contém uma linha para cada linha que já não pertence em uma determinada partição. Uma linha se muda de uma partição se:

    • A linha é excluída. Se uma linha for excluída de uma tabela de usuário, uma linha será inserida na MSmerge_tombstone e uma ou mais linhas serão inseridas na MSmerge_past_partition_mappings.

    • O valor de uma coluna usada para filtragem foi alterado. Por exemplo, se um filtro com parâmetros estiver baseado no estado em que uma empresa estiver sediada e a empresa se mudar, a linha da empresa (e as linhas relacionadas em outras tabelas) pode se mudar da partição de dados de uma pessoa de vendas para a partição de outra pessoa de vendas. Se uma linha for atualizada de modo que ela não pertença mais a uma partição, uma linha será inserida ou atualizada na MSmerge_tombstone e uma ou mais linhas serão inseridas na MSmerge_past_partition_mappings.

    ObservaçãoObservação

    Se não houver partições sobrepostas com uma assinatura por partição (um valor de 3 para o parâmetro sp_addmergearticle@partition_options) será utilizado, as tabelas de sistemaMSmerge_current_partition_mappings e MSmerge_past_partition_mappings não são usadas para rastrear o mapeamento de partição das linhas, porque cada linha pertence somente a uma partição e pode ser alterada somente em um Assinante.

Avaliação de partição com o uso do processo SetupBelongs

Sem as partições pré-computadas, um processo conhecido como SetupBelongs é usado. Durante a sincronização, a avaliação de partição é executada para cada alteração feita a uma tabela filtrada no Publicador desde a última vez que o Merge Agent foi executado para um Assinante específico. Este processo está repetido para cada Assinante que sincroniza com o Publicador.

Para executar a avaliação de partição para um Assinante, o Merge Agent chama o procedimento armazenado de sistema sp_MSsetupbelongsque:

  1. Cria duas tabelas temporárias para cada artigo filtrado: **#belongs_<Número_Aleatório>**e #notbelongs_<Número_Aleatório>.

  2. Usa o valor que retorna das funções SUSER_SNAME() e/ou HOST_NAME() no Assinante para consultar uma exibição do sistema; a consulta é usada para determinar se uma linha na MSmerge_contents ou MSmerge_tombstone é relevante para a partição do Assinante.

  3. Se a linha não for relevante para o Assinante (como uma inserção de outra partição), os metadados desta linha não serão armazenados em #belongs ou #notbelongs. Se a linha for relevante, haverá dois possíveis resultados:

    • Uma linha será adicionada a #belongs se: a linha em MSmerge_contents for uma inserção que pertence à partição ou a linha em MSmerge_contents for uma atualização que não altera os valores em qualquer coluna usada para filtragem.

    • Uma linha será adicionada a #notbelongs se: a linha em MSmerge_contents for uma atualização que não altera os valores em qualquer coluna usada para filtragem (em outras palavras, move a linha para uma nova partição) ou a linha em MSmerge_tombstone representa a exclusão de uma linha na partição.

ObservaçãoObservação

Mesmo que as partições pré-computadas estejam habilitadas, o processo SetupBelongs será usado na primeira vez que uma assinatura sincronizar se a assinatura for criada após outras assinaturas começarem a receber as alterações.