Compreendendo junções de hash
A junção de hash tem duas entradas: a entrada de construção e entrada de investigação. O otimizador de consulta nomeia estes papéis de forma que a menor das duas entradas é a entrada de construção.
Junções de hash são usadas para muitos tipos de operações para definir correspondente: junção interna; esquerda, direita e junção externa completa; semi-junção esquerda e direita ; interseção; união; e diferença. Além disso, uma variante da junção de hash pode fazer a remoção e agrupamento de duplicatas, como SUM (salário) GROUP BY departamento. Essas modificações usam só uma entrada para os papéis de construção e investigação.
As seções seguintes descrevem tipos diferentes de junções de hash: junção de hash em-memória, junção de hash de cortesia e junção de hash recursiva.
Junção Hash em-Memória
A junção de hash primeiro verifica ou calcula a entrada de construção inteira e então constrói uma tabela de hash em memória. Cada linha é inserida em um compartimento de memória hash que depende do valor de hash computado para a chave hash. Se a entrada de construção inteira for menor que a memória disponível, todas as linhas poderão ser inseridas na tabela de hash. Essa fase de construção é seguida pela fase de investigação. A entrada de investigação inteira é verificada ou calculada uma linha de cada vez e o valor da chave de hash é calculado para cada linha de investigação, o compartimento de hash correspondente é verificado e as correspondências são produzidas.
Junção hash de cortesia
Se a entrada de construção não couber na memória, uma junção de hash continua em vários passos. Isso é conhecido como uma junção hash de cortesia. Cada passo tem uma fase de construção e fase de investigação. Inicialmente, a construção inteira e entradas de investigação são consumidas e particionadas (usando uma função de hash na chave hash) em arquivos múltiplos. Usando a função de hash nas chaves de hash garante que quaisquer dois registros de junção devem estar no mesmo par de arquivos. Portanto, a tarefa de unir duas entradas grandes foi reduzida a instâncias múltiplas, mas menores, das mesmas tarefas. A junção de hash é se aplicada então a cada par de arquivos particionados.
Junção hash recursiva
Se a entrada de construção for tão grande que entradas para uma fusão externa padrão requereriam níveis de fusão múltiplos, serão requeridos passos de particionamentos múltiplos e níveis de particionamentos múltiplos. Se somente algumas das partições forem grandes, passos de particionamentos adicionais serão usados apenas para essas partições específicas. Para fazer todos os passos de particionamento tão rápido quanto possível, operações grandes, assíncronas de I/O são usadas de forma que um único thread pode manter unidades de disco múltiplas ocupadas.
![]() |
---|
Se a entrada de construção só for ligeiramente maior que a memória disponível, elementos de junção de hash em-memória e junção de hash de cortesia serão combinados em um único passo, produzindo uma junção de hash híbrida. |
Nem sempre é possível durante otimização determinar qual junção de hash é usada. Portanto, o SQL Server inicia usando uma junção de hash em-memória e gradualmente transita para junção de hash de cortesia e junção de hash recursiva, dependendo do tamanho da entrada de construção.
Se o otimizador se antecipar erroneamente qual das duas entradas será menor e, portanto, deveria ter sido a entrada de construção, os papéis de construção e investigação são invertidos dinamicamente. A junção de hash garante que usa o menor arquivo com excedente como entrada de construção. Essa técnica é chamada de reversão de papel. A reversão de papel acontece dentro da junção de hash depois de pelo menos um derramamento para o disco.
![]() |
---|
A reversão de papel acontece independente de qualquer dica de consulta ou estrutura. A reversão de papel não aparecerá em seu plano de consulta; quando acontecer, é transparente ao usuário. |
Abandono de hash
O termo de abandono de hash às vezes é usado para descrever junções de hash de cortesia ou junções de hash recursivas.
![]() |
---|
Junções de hash recursivas ou abandonos de hash causam desempenho reduzido em seu servidor. Se você vir muitos eventos de advertência de hash em um rastreamento, atualizações de estatísticas nas colunas que estão sendo unidas. |
Para obter mais informações sobre abandono de hash, consulte Classe de evento Hash Warning.
Consulte também