SQL Server: Hash and Stream aggregate algorithm
SQL Server utilizza due operatori fisici per gestire le aggregazioni (GROUP BY): lo Stream aggregate e l’Hash aggregate. Alla base di questi due operatori vi sono due diversi algoritmi, con caratteristiche diverse, che SQL Server sceglie a seconda della situazione.
Un esempio:
DROP TABLE ORDINI CREATE TABLE ORDINI (IDPRODOTTO INT, QUANTITA INT) GO INSERT INTO ORDINI VALUES (1, 1) GO 50 INSERT INTO ORDINI VALUES (2, 1) GO 30 INSERT INTO ORDINI VALUES (3, 1) GO 60 |
La query di aggregazione:
SELECT IDPRODOTTO, COUNT(IDPRODOTTO) AS [ORDINATO] FROM ORDINI GROUP BY IDPRODOTTO |
Viene risolta in questo modo attraverso l’operatore Stream:
Ora inseriamo un pò di record e rifacciamo la stessa query:
INSERT INTO ORDINI VALUES (1, 1) GO 5000 INSERT INTO ORDINI VALUES (2, 1) GO 3000 INSERT INTO ORDINI VALUES (3, 1) GO 6000 SELECT IDPRODOTTO, COUNT(IDPRODOTTO) AS [ORDINATO] FROM ORDINI GROUP BY IDPRODOTTO |
Il piano di esecuzione questa volta prevere l’operatore Hash Match, scelta dovuta alla dimensione maggiore della tabella:
I due algoritmi alla base degli operatori sono:
Algoritmo hash
Per ogni riga in input { Calcola il valore hash basato sulle colonne incluse nella clausola group by cerca il valore trovato nella tabella hash if non trovato inserisce una nuova riga nella tabella hash</code> else aggiorna la riga trovato con il nuovo valore</code> } restituisce tutte le righe presenti nella tabella hash
Algoritmo Stream
pulisce i totali correnti pulisce il valore attuale delle colonne di group by per ogni riga in input { se la riga attuale non corrisponde con il valore attuale delle colonne del group by { restituisce i totali corrente pulisce i totali correnti imposta il valore attuale delle colonne di group by con la riga corrente } update del totale di aggregazione }
Leave a Reply