Estou começando a aprender os planos de execução e estou confuso sobre como exatamente uma correspondência de hash funciona e por que ela seria usada em uma junção simples:
select Posts.Title, Users.DisplayName
From Posts JOIN Users on
Posts.OwnerUserId = Users.Id
OPTION (MAXDOP 1)
Pelo que entendi, os resultados da verificação de índice superior tornam-se capazes de hash e cada linha na verificação clusterizada de índice inferior é pesquisada. Eu entendo como as tabelas de hash funcionam pelo menos até certo ponto, mas estou confuso sobre quais valores são exatamente hash em um exemplo como este.
O que faria sentido para mim é que o campo comum entre eles, o id, seja hash - mas se for esse o caso, por que hash um número?
Como as citações de resposta do SQLRockstar
Agora,
São 2 entradas não ordenadas.
Eu consideraria um índice na tabela Posts em OwnerUserId, incluindo Title. Isso adicionará alguma ordem em um lado da entrada para o JOIN + ele estará cobrindo o índice
Você pode descobrir que o índice Users.DisplayName não será usado e, em vez disso, ele verificará o PK.
De http://sqlinthewild.co.za/index.php/2007/12/30/execution-plan-operations-joins/
"A junção de hash é uma das operações de junção mais caras, pois requer a criação de uma tabela de hash para fazer a junção. Dito isso, é a junção que é melhor para entradas grandes e não classificadas. É a que mais consome memória de todas das junções
A junção de hash primeiro lê uma das entradas e faz o hash da coluna de junção e coloca o hash resultante e os valores da coluna em uma tabela de hash construída na memória. Em seguida, ele lê todas as linhas na segunda entrada, faz o hash delas e verifica as linhas no balde de hash resultante para as linhas de junção."
que links para este post:
Link
HTH
A vantagem de fazer o hash de um campo numérico é que você pega um valor maior e o divide em partes menores para que ele caiba em uma tabela de hash.
Veja como Grant Fritchey descreve isso:
"Uma tabela de hash, por outro lado, é uma estrutura de dados que divide todos os elementos em categorias de tamanhos iguais, ou buckets, para permitir acesso rápido aos elementos. A função de hash determina em qual bucket um elemento vai. Por exemplo , você pode pegar uma linha de uma tabela, transformá-la em um valor de hash e armazenar o valor de hash em uma tabela de hash."
Você também pode obter uma cópia gratuita de seu ebook "Dissecting SQL Server Execution Plans" em um link do seguinte artigo:
Fonte: http://www.simple-talk.com/sql/performance/graphical-execution-plans-for-simple-sql-queries/