SQL Server 2008 Join dicas
-
20-09-2019 - |
Pergunta
Recentemente, eu estava tentando otimizar esta consulta
UPDATE Analytics
SET UserID = x.UserID
FROM Analytics z
INNER JOIN UserDetail x ON x.UserGUID = z.UserGUID
O plano de execução estimado mostra 57% na atualização da tabela e 40% em uma correspondência de hash (agregada). Fiz alguns bisbilhotando e me deparei com o tópico de junção. Então eu adicionei uma dica de loop à minha junção interna e Wa-Zham! O novo plano de execução mostra 38% na atualização da tabela e 58% em uma busca por índice.
Então, eu estava prestes a começar a aplicar dicas de loop a todas as minhas perguntas até que a Prudence tenha me tirado. Depois de pesquisar no Google, percebi que as dicas de junção não estão muito bem cobertas em Bol. Portanto...
- Alguém pode me dizer por que aplicar dicas de loop a todas as minhas perguntas é uma má ideia. Eu li em algum lugar que uma junção de loop é o método de junção padrão para o Optyterizador de consulta, mas não conseguiu verificar a validade da declaração?
- Quando a junção é usada? Quando a merda atinge o ventilador e os caçadores de fantasmas não estão na cidade?
- Qual é a diferença entre loop, hash e fusão dicas? Bol afirma que a mesclagem parece ser a mais lenta, mas qual é a aplicação de cada dica?
Obrigado pelo seu tempo e ajude as pessoas!
Estou executando o SQL Server 2008 btw. As estatísticas mencionadas acima são planos de execução estimados.
Solução
Alguém pode me dizer por que aplicar dicas de loop a todas as minhas perguntas é uma má ideia. Eu li em algum lugar que uma junção de loop é o método de junção padrão para o Optyterizador de consulta, mas não conseguiu verificar a validade da declaração?
Porque isso rouba o otimizador da oportunidade de considerar outros métodos que podem ser mais eficientes.
Quando a junção é usada? Quando a merda atinge o ventilador e os caçadores de fantasmas não estão na cidade?
Quando a distribuição de dados (na qual o otimizador toma suas decisões) é severamente distorcido e as estatísticas não são capazes de representá -lo corretamente.
Qual é a diferença entre loop, hash e fusão dicas? Bol afirma que a mesclagem parece ser a mais lenta, mas qual é a aplicação de cada dica?
Estes são algoritmos diferentes.
LOOP
IS IS Nested Loops: Para cada registro da tabela externa, a tabela interna é pesquisada por correspondências (usando o índice de disponível). Mais rápido quando apenas uma pequena parte dos registros de ambas as tabelas satisfazem oJOIN
e aWHERE
condições.MERGE
As duas tabelas os atravessam na ordem de classificação, pulando os registros incomparáveis. Mais rápido para oFULL JOIN
s e quando os dois registros já estão classificados (de operações de classificação anteriores ou quando o caminho de acesso ao índice é usado)HASH
Construa uma tabela de hash no armazenamento temporário (memória outempdb
) de uma das tabelas e pesquisam cada registro do outro. Mais rápido se a grande parte dos registros de qualquer tabela corresponde aoWHERE
eJOIN
doença.
Outras dicas
O plano de execução estimado mostra 57% na atualização da tabela e 40% em uma correspondência de hash (agregada). Fiz alguns bisbilhotando e me deparei com o tópico de junção. Então eu adicionei uma dica de loop à minha junção interna e Wa-Zham! O novo plano de execução mostra 38% na atualização da tabela e 58% em uma busca por índice.
Certamente isso significa que seu plano proposto é pior? Supondo que a atualização da tabela leva um tempo constante, agora está sendo custado pela atividade do índice.