Pergunta

Quais são as vantagens, se houver, de fazer explicitamente um hash mais de um regular JOIN (na qual o SQL Server irá decidir a melhor estratégia JOIN)? Por exemplo:

select pd.*
from profiledata pd
inner hash join profiledatavalue val on val.profiledataid=pd.id

No código de exemplo simplista acima, eu estou especificando a estratégia de junção, enquanto que se eu deixar de fora o "Hash" palavra-chave SQL Server irá fazer uma junção por mesclagem nos bastidores (por o "plano de execução real").

Foi útil?

Solução

O optmiser faz um trabalho bom o suficiente para o uso diário. No entanto, em teoria, pode precisar de 3 semanas para encontrar o plano perfeito ao extremo, então há uma chance de que o plano gerado não será ideal.

Eu deixá-lo sozinho a menos que você tiver uma consulta muito complexa ou grandes quantidades de dados, onde ele simplesmente não pode produzir um plano bom. Então eu considerá-lo.

Mas ao longo do tempo, como alterações de dados / cresce ou índices alterar etc, a sua dica de junção irá torna-se um plano ideal obsoleto e evita. A dica de junção só pode otimizar para essa única consulta no momento do desenvolvimento com o conjunto de dados que você tem.

Pessoalmente, eu nunca especificou uma dica de junção em qualquer código de produção.

Eu normalmente resolvido uma má junção mudando minha consulta ao redor, adicionando / mudando um índice ou quebrá-lo (por exemplo, carregar uma tabela temporária em primeiro lugar). Ou minha consulta estava errado, ou eu tinha uma conversão tipo de dados implícito, ou ele destacou uma falha no meu esquema etc.

Eu vi outros desenvolvedores usá-los, mas apenas quando eles tinham visões complexas aninhado em cima visões complexas e eles causaram problemas mais tarde, quando eles reformulado.

Editar:

Eu tive uma conversão hoje, onde alguns colegas estão indo para usá-los para forçar um plano de consulta ruim (com NOLOCK e MAXDOP 1) para "incentivar" a migração longe do legado complexos vistas aninhadas que um de seus sistema a jusante chama diretamente.

Outras dicas

Ao tentar uma dica de hash, como sobre: ??

  • Depois de verificar que existem índices adequados em pelo menos um dos mesas.
  • Depois de ter tentado re-organizar a consulta. Coisas como converter junta-se a "in" ou "existe", mudando ordem de associação (que só é realmente um dica de qualquer maneira), movendo-se a lógica de onde cláusula para se juntar condição, etc.

Algumas regras básicas sobre quando uma junção de hash é eficaz é quando uma condição de junção não existe como um índice da tabela e quando os tamanhos tabelas são diferentes. Se você está procurando uma descrição técnica existem algumas boas descrições lá fora, sobre como um hash obras.

Por que usar qualquer juntar dicas (haxixe / merge / loop com efeito colateral do fim vigor)?

  • Para evitar a execução extremamente lento. (0,5 -> 10.0s) de casos de canto
  • Quando o otimizador escolhe de forma consistente um plano medíocre.

Uma dica fornecido é susceptível de ser não-ideal para algumas circunstâncias, mas fornece mais consistentemente tempos de execução previsíveis. O pior caso esperado e melhores cenários devem ser pré-testado ao usar uma dica. tempos de execução previsíveis são críticos para serviços web onde um rigidamente optimizadas nominais [.3s, .6s] consulta é preferida sobre uma que pode intervalo [0,25], 10.0s por exemplo. Grandes variações de tempo de execução pode acontecer com as estatísticas recém-atualizado e melhores práticas seguidas.

Ao testar em um ambiente de desenvolvimento, deve-se desligar "batota", assim como para evitar quente / frio runtime variações. De outro pós ...

CHECKPOINT -- flushes dirty pages to disk
DBCC DROPCLEANBUFFERS -- clears data cache
DBCC FREEPROCCACHE -- clears execution plan cache

A última opção pode ser o mesmo que a opção (recompilação) dica.

O MAXDOP e carregamento da máquina também pode fazer uma enorme diferença no tempo de execução. Materialização de CTE em tabelas temporárias também é um bom bloqueio para baixo mecanismo e algo a considerar.

Hash junta parallelize e escala melhor do que qualquer outro juntar-se e são ótimos para maximizar o rendimento em armazéns de dados.

A única dica que eu já vi no envio de código era OPÇÃO (FORCE ORDER). bug estúpido no otimizador de consulta SQL geraria um plano que tentou aderir a um varchar não filtrada e um identificador exclusivo. Adicionando FORCE ORDER causou a executar o filtro em primeiro lugar.

Eu sei, sobrecarregando colunas é ruim. Às vezes, você tem que viver com ela.

O optimizator plano lógico não garante a você que encontra a solução ideal: um algoritmo exato é muito lento para usar em um servidor de produção; em vez disso, são utilizados alguns algoritmos gananciosos.

Assim, a lógica por trás desses comandos é permitir que o usuário especifique a estratégia ideal juntar-se, no caso do optimizator não pode separar o que é realmente o melhor para adotar.

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