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:

aggregate1

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:

aggregate2

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

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>