Estou executando o seguinte procedimento armazenado para adicionar um filtro de junção de replicação de mesclagem,
sp_addmergefilter
O que mais esse procedimento armazenado faz nos bastidores?
Estou chamando esse procedimento armazenado e, em um caso, ele atinge o tempo limite após 10 minutos. O filtro de junção é este para as duas tabelas DispatchLink e Dispatch,
Dispatch.DispatchId = DispatchLink.DispatchLink1 and Dispatch.ContractId = DispatchLink.ContractLink1
or Dispatch.DispatchId = DispatchLink.DispatchLink2 and Dispatch.ContractId = DispatchLink.ContractLink2
A estrutura dessas duas tabelas é explicada aqui,
Se eu remover todas as coisas após o 'ou', ele será executado rapidamente.
É muito interessante o que encontrei. Eu inicio o SSMS como administrador e escolhi a opção de depurar o procedimento armazenado. Eu descobri que estava fazendo isso,
E parece que o motivo disso era testar se a cláusula de junção era viável, ou seja, se havia erros de sintaxe, etc.
O plano de consulta resultante é o problema e pode ser visto aqui,
Analisando um plano de consulta
Adicionar WITH (FORCESEEK) torna a consulta instantânea, mas é claro que não posso fazer isso porque é exatamente isso que sp_addmergefilter está fazendo internamente. O otimizador de consulta está fazendo uma escolha incorreta por algum motivo.