SQL Server ottimizzazioni: perchè non utilizzare l’asterisco nelle SELECT?

Carissimi lettori, 

E' appena iniziato Novembre noi però siamo nuovamente assieme per parlare di ottimizzazioni!

Un paio di articoli fa parlavamo di quanto fosse utile indicare lo schema davanti al nome della tabella al fine di migliorare le prestazioni delle nostre Query (qui SQL Server Ottimizzazioni: non omettere il nome dello schema! (schema name resolution) )

Oggi invece parliamo di un altra ottimizzazione anch'essa facilmente implementabile.
Parliamo infatti dell'utilizzo dell' asterisco (*) nelle SELECT.

Mi raccomando, seguitemi numerosi!
Buona lettura!


Chi è senza peccato scagli la prima pietra


Lo ammetto! Capita anche a me, scrivendo Query per delle interrogazioni esterporanee, di iniziare con il classico:
       
SELECT * FROM TABELLA JOIN .... etc etc etc.

Certo l'utilizzo dell'asterisco è comodo: in un colpo solo estraggo tutti le colonne della tabella.

Se però la nostra query viene utilizzata ad un applicativo, magari dentro ad un ciclo, oppure viene eseguita centinaia e centinaia di volte?

E' ancora consigliato l'utilizzo?

Beh se state leggendo questo articolo avrete già capito che la risposta esatta è no!
 
Perchè?

Perchè se mettete l'asterisco sarà SQL Server a dover ricavare l'elenco del campi delle tabelle interessate.

Per farlo dovrà andare sulle tabelle di sistema e leggere quali solo le colonne di cui sono composte.

Effettuare questa identica ed inutile operazione centinaia di volte ha un costo.

Per di più potremmo generare contenzione proprio sulle tabelle di sistema che abbiamo appena detto contenere l'elenco campi delle tabella.

Quindi, non lo si deve utilizzare proprio mai?

Ci sono in realtà due eccezioni dove lo si può utilizzare:
  • Nella funzione COUNT(*)
  • Nella sottoquery dentro ad un IF EXISTS


Non ci credete? ...facciamo una prova!


Confrontiamo le seguenti due Query in cui l'unica differenza è l'utilizzo dell'asterisco oppure no.

SELECT * FROM NOMETABELLA WHERE ID = <VALORE>

SELECT CAMPO1, CAMPO2, CAMPO3 FROM NOMETABELLA WHERE ID = <VALORE>


Per valutare i tempi ci affidiamo al tool gratuito RML di MicroSoft.

Se volete leggere come installarlo ed utilizzato potete leggere qui: installare ed utilizzare le rml👈


La prima query eseguita 10.000 volte impiega 55,5 secondi



La seconda query eseguita 10.000 volte impiega 54,8 secondi






Certo il guadagno sembra minimo nell'ordine di un punto percentuale però occorre tenere in considerazione il fatto che stavamo eseguendo solo noi le Query: in presenza di concorrenza e di un carico di lavoro la situazione è diversa.


Ciao ed alla prossima! 
Luca


Luca Biondi @ SQLServerPerformance blog!

 

 

 

 

 

Next post:NEWS! Edizione Speciale! SQL Server 2019 è arrivato tra di noi!

Previous post: SQL Server: Transazioni, Lock e Deadlock. Un po di teoria spiegata in modo semplice!









Comments

I Post più popolari

SQL Server, execution plan and the lazy spool (clearly explained)

SQL Server, datetime vs. datetime2

How to solve EXECUTE Permission denied on object 'sp_send_dbmail'