Noções básicas do plano de execução - confusão de correspondência de hash

39

Estou começando a aprender planos de execução e estou confuso sobre como exatamente uma correspondência de hash funciona e por que ela seria usada em uma associação simples:

select Posts.Title, Users.DisplayName
From Posts JOIN Users on
Posts.OwnerUserId = Users.Id
OPTION (MAXDOP 1)

insira a descrição da imagem aqui

Pelo que entendi, os resultados da verificação superior do índice tornam-se hashable e cada linha na verificação agrupada do índice inferior é pesquisada. Entendo como as tabelas de hash funcionam, pelo menos em algum grau, mas estou confuso sobre quais valores são exatamente copiados em um exemplo como este.

O que faria sentido para mim é o campo comum entre eles, o id, é o hash - mas, se for esse o caso, por que o hash de um número?

Kyle Brandt
fonte

Respostas:

29

Como a resposta da SQLRockstar cita

melhor para entradas grandes e não classificadas.

Agora,

  • da varredura de índice Users.DisplayName (assumida não clusterizada), você obtém Users.Id (assumindo clusterizado) = não classificado
  • Você também está digitalizando postagens para OwnerUserId = unsorted

São 2 entradas não ordenadas.

Eu consideraria um índice na tabela Posts em OwnerUserId, incluindo Title. Isso adicionará alguma ordem de um lado da entrada ao JOIN +, cobrindo o índice

CREATE INDEX IX_OwnerUserId ON Posts (OwnerUserId) INCLUDE (Title)

Você pode descobrir que o índice Users.DisplayName não será usado e, em vez disso, verificará o PK.

gbn
fonte
11
Ah, tudo bem, vejo agora, eu estava pensando no Users.DisplayName sendo encomendado pelo PK, o que não é o caso. Agora, o uso do Hash faz muito mais sentido para mim. Obrigado!
Kyle Brandt
11
Você também pode tentar a OPTION (FAST n)dica, onde n é o número aproximado de linhas que você espera. O que isso fará é direcionar o otimizador para loops aninhados em vez de junções de hash quando n estiver baixo. O motivo é que as junções de hash são rápidas para junções grandes, mas têm um alto custo de inicialização. Os loops aninhados são caros por linha, mas podem começar muito barato. Portanto, é uma questão de ajuste fino com base nos dados reais e no padrão de acesso.
Gaius
11
@ Gaio: Pessoalmente, eu prefiro ter índices do que dicas. Uma dica só é boa para a consulta quando você a adiciona. Também, a dica se torna um passivo ao longo do tempo. Os índices tendem a ser úteis por muito mais tempo.
Gbn 28/03
11
não é um ou-ou proposição :-)
Gaius
14

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 muita memória. das junções

A junção de hash lê primeiro uma das entradas e hashes a coluna de junção e coloca os valores de hash e coluna resultantes em uma tabela de hash criada na memória. Em seguida, ele lê todas as linhas da segunda entrada, faz o hash e verifica as linhas no intervalo de hash resultante para as linhas de junção ".

quais links para este post:

http://blogs.msdn.com/b/craigfr/archive/2006/08/10/687630.aspx

HTH

SQLRockstar
fonte
Então, se são apenas os campos de identificação, acho que não entendo a vantagem de fazer hash em um campo de identificação?
Kyle Brandt
+1 no link para o blog de Craig Freedman, há mais artigos disponíveis: blogs.msdn.com/b/craigfr/archive/tags/joins
Jeff
9

A vantagem de fazer hash em um campo numérico é que você está pegando um valor maior e dividindo-o em pedaços menores para que ele possa caber em uma tabela de hash.

Veja como Grant Fritchey o descreve:

"Uma tabela de hash, por outro lado, é uma estrutura de dados que divide todos os elementos em categorias de tamanho igual, ou buckets, para permitir acesso rápido aos elementos. A função de hash determina em qual bucket um elemento entra. Por exemplo , você pode pegar uma linha de uma tabela, fazer a hash em um valor de hash e depois armazenar o valor em uma tabela de hash. "

Você também pode obter uma cópia gratuita de seu e-book "Dissecando planos de execução do SQL Server" em um link do seguinte artigo:

Fonte: http://www.simple-talk.com/sql/performance/graphical-execution-plans-for-simple-sql-queries/

Jeff
fonte
Outra série interessante de artigos sobre o JOINS: sql-server-performance.com/articles/dba/…
Jeff
Estou trabalhando do jeito que dissecar os planos de execução do SQL Server - é ótimo! Mas eu tenho um pouco preso neste ponto :-P
Kyle Brandt
Link direto ao eBook
woodvi 17/11