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...

  1. 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?
  2. Quando a junção é usada? Quando a merda atinge o ventilador e os caçadores de fantasmas não estão na cidade?
  3. 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.

Foi útil?

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.

  1. 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 o JOIN e a WHERE condições.

  2. MERGE As duas tabelas os atravessam na ordem de classificação, pulando os registros incomparáveis. Mais rápido para o FULL JOINs 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)

  3. HASH Construa uma tabela de hash no armazenamento temporário (memória ou tempdb) de uma das tabelas e pesquisam cada registro do outro. Mais rápido se a grande parte dos registros de qualquer tabela corresponde ao WHERE e JOIN 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top