MSSQL 2008R2: Atualizações do índice do Phantom

1

Eu estava tentando executar a seguinte consulta:

    Update A    
     SET A.Col1 = B.Col1, 
         ...
         A.ColN = B.ColN
    FROM A INNER JOIN B    
    ON (A.Col1 = B.Col1)     
    WHERE B.Col2 = X AND (A.Col1 <> B.Col1 OR ... OR A.ColN <> B.ColN)

A consulta afeta somente 4700 linhas (e 7 colunas) em sua atualização. Mas leva mais de 10 minutos e bloqueia vários outros usuários de muitas outras tabelas.

Eu verifiquei o plano de consulta e nada menos que 12 índices foram atualizados como resultado dessa consulta. Eu sei que os bancos de dados legados estão super indexados. Isso não é problema meu agora.

Minha pergunta é a seguinte: 7 dos índices que estão sendo atualizados (e os 3 mais caros) não são da tabela A ou da tabela B. Eu verifiquei todos os gatilhos na tabela e nenhum deles levou a efeito algum sobre o duas outras tabelas sendo atualizadas.

Como isso pode estar acontecendo? Qual mecanismo existe que poderia causar essas atualizações fantasmas?

    
por Aushin 18.02.2011 / 21:02

2 respostas

1

Não importa, descobri o problema. Houve uma atualização para uma coluna que era uma chave estrangeira para outra tabela. Como a chave estrangeira estava sendo atualizada, as linhas referenciadas pela chave estrangeira precisavam ser atualizadas, causando as atualizações de índice nas tabelas afetadas.

    
por 18.02.2011 / 21:54
0

Você tem exibições indexadas que também fazem referência a essas tabelas? Uma atualização dessas tabelas também causaria atualizações de índice nas exibições indexadas.

    
por 18.02.2011 / 21:29