Performance di un database

Performance SQL: semplici tecniche per scrivere query più veloci

In questo articolo sono mostrati dei semplici accorgimenti per migliorare le performance del codice SQL, per imparare a scrivere query più veloci e performanti.

 

Performance SQL: scrivere condizioni Sargable

Le condizioni Sargable sono delle condizioni inserite nella Where di una query che permettono al motore di database di utilizzare gli indici presenti sulle colonne oggetto del filtro. Vediamo una serie di esempi per spiegare meglio il concetto.

Queste due query sembrano completamente identiche. Entrambe estraggono gli Id delle fatture emesse nel 2020. Tuttavia l’utilizzo della funzione YEAR all’interno della seconda query non permette di utilizzare gli indici presenti sulla colonna DataFattura, rendendo necessario, anche in questo caso, la scansione completa della fattura

SELECT IdFattura
FROM    Fattura
WHERE DataFattura>=’20200101′ and DataFattura<‘20200101’;

SELECT IdFattura
FROM    Fattura
WHERE YEAR(DataFattura)=2020;

Vediamo un altro esempio. Qui l’obiettivo è estrarre l’elenco dei cognomi dei nostri clienti che iniziano con la lettera N. Ciò viene fatto tramite il costrutto LIKE nella prima query e la funzione LEFT nella seconda. 

SELECT Cognome
FROM Clienti
WHERE Cognome LIKE ‘N%’

SELECT Cognome
FROM Clienti
WHERE LEFT(Cognome,1)=’N’

Anche in questo caso l’utilizzo di LEFT impedisce l’utilizzo di un eventuale indice, con importanti impatti sulle performance della query

 

Sostituire dove possibile Union con Union ALL

Union e union all vengono utilizzate per concatenare il risultato di più query. La differenza tra i due costrutti consiste nel fatto che l’Union, oltre ad accodare i dati, rimuove anche i duplicati presenti nella prima query, nella seconda query e nel risultato finale concatenato. Molto spesso si è sicuri che la query non potrà mai restituire duplicati per come è costruita, ad esempio perché contiene al suo interno un identificativo univoco. Tuttavia è comune la tendenza ad utilizzare anche in questi casi la Union, poiché non ha impatti sull’output della query.

Questo è un errore abbastanza grave dal punto di vista delle performance, infatti costringeremo il database ad effettuare comunque una ricerca di duplicati, anche sapendo che non impatterà l’output della query. Cercare i valori duplicati è un’operazione tra le più costose, a maggior ragione bisogna evitarla nei casi in cui è inutile sostituendo Union con Union All.

 

T-SQL avanzato: utilizzare la clausola Grouping Sets

Riportare in un unico output sia i dati aggregati su certe dimensioni e sia una riga contenente le somme totali su tutte le righe è un’esigenza molto comune in fase di reporting. Un classico approccio consiste nell’utilizzare l’Union All per unire una query in cui è presente una Group by con una query in cui viene calcolato il totale complessivo. Ecco un esempio.

SELECT       Nazione, Count(*) as numero
FROM          Clienti
GROUP BY Nazione
UNION ALL
SELECT      ‘Totale’ AS Nazione, Count(*) as numero
FROM          Clienti

Questa query costringe il piano d’esecuzione ad effettuare due volte la scansione della tabella Clienti. Ciò può essere evitato su Sql Server utilizzando il costrutto Grouping Sets dopo la Group by.

SELECT       CASE WHEN Grouping_id(Nazione)=0 THEN Nazione ELSE ‘Totale’ END as Nazione,
Count(*) as numero
FROM          Clienti  GROUP BY Nazione
GROUP BY  Grouping Sets ( (Nazione), () )

Nella select viene utilizzata la funzione Grouping_id per distinguere il Null relativo alla somma totale dall’eventuale presenza di Null nella colonna Nazione.

 

Performance SQL: e adesso?

Leggi l’articolo sul piano di esecuzione di una query oppure se cerchi un corso visita la pagina sulla formazione avanzata nelle performance di Sql Server.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Torna su