it-swarm.it

Nozioni di base sul piano di esecuzione: confusione dell'hash match

Sto iniziando a imparare i piani di esecuzione e sono confuso su come funziona esattamente una partita di hash e perché sarebbe utilizzata in un semplice join:

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

enter image description here

Da quanto ho capito, i risultati della scansione dell'indice superiore diventano l'hash in grado e ogni riga nella scansione cluster dell'indice inferiore viene cercata. Capisco come le tabelle di hash funzionano almeno in una certa misura, ma sono confuso su quali valori vengono esattamente sottoposti a hash in un esempio come questo.

Cosa avrebbe senso per me è il campo comune tra loro, l'id, è cancellato - ma se è così, perché è un numero?

41
Kyle Brandt

Come cita la risposta di SQLRockstar

ideale per input grandi e non ordinati.

Adesso,

  • dalla scansione dell'indice Users.DisplayName (assunto non cluster) si ottiene Users.Id (assumendo cluster) = non ordinato
  • Stai anche eseguendo la scansione dei messaggi per OwnerUserId = unsorted

Si tratta di 2 ingressi non ordinati.

Considererei un indice nella tabella Posts su OwnerUserId, incluso Title. Ciò aggiungerà un certo ordine su un lato dell'input a JOIN + coprirà l'indice

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

È quindi possibile scoprire che l'indice Users.DisplayName non verrà utilizzato e verrà invece scansionato il PK.

31
gbn

Da http://sqlinthewild.co.za/index.php/2007/12/30/execution-plan-operations-joins/

"Il join hash è una delle operazioni di join più costose, in quanto richiede la creazione di una tabella hash per eseguire il join. Detto questo, è il join che è il migliore per input di grandi dimensioni, non ordinati. È il più dispendioso in termini di memoria di qualsiasi dei join

Il join hash legge prima uno degli input e esegue l'hashing della colonna join e inserisce i valori hash e colonna risultanti in una tabella hash creata in memoria. Quindi legge tutte le righe nel secondo input, esegue l'hashing e verifica le righe nel bucket hash risultante per le righe di join. "

che collega a questo post:

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

HTH

14
SQLRockstar

Il vantaggio dell'hashing di un campo numerico è che stai prendendo un valore più grande e suddividendolo in pezzi più piccoli in modo che possa adattarsi a una tabella di hash.

Ecco come lo descrive Grant Fritchey:

"Una tabella di hash, d'altra parte, è una struttura di dati che divide tutti gli elementi in categorie di dimensioni uguali, o bucket, per consentire un rapido accesso agli elementi. La funzione di hashing determina in quale bucket si trova un elemento. Ad esempio , puoi prendere una riga da una tabella, hash in un valore hash, quindi archiviare il valore hash in una tabella hash. "

È inoltre possibile ottenere una copia gratuita del suo ebook "Analisi dei piani di esecuzione di SQL Server" da un collegamento dal seguente articolo:

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

9
Jeff