SQL Server:
Parameter Sniffing

In questo articolo parliamo del fenomeno noto come Parameter Sniffing. Per ottimizzare le performance, Sql Server potrebbe memorizzare il piano di esecuzione di una stored procedure alla sua prima esecuzione. Il parameter sniffing è quel fenomeno per cui lo stesso piano di esecuzione sarà utilizzato anche nei successivi run, nonostante ne esisterebbero altri più efficienti al variare dei valori dei parametri passati in input.

Pensiamo ad esempio ad una stored procedure che contiene una query che filtra su una colonna utilizzando un parametro di input. Supponiamo inoltre che tale colonna sia indicizzata con un nonclustered index. In base alle statistiche del database, il piano di esecuzione migliore per la query potrebbe essere diverso al variare del parametro: ad esempio in alcuni casi potrebbe essere previsto l’utilizzo dell’indice non clustered (se il filtro è abbastanza selettivo), mentre in altri no (se i costi delle operazioni di key o rid lookup sono troppo alti).

Tuttavia, il fatto che Sql Server memorizzi il piano di esecuzione avrà come conseguenza l’utilizzo dell’algoritmo scelto per il primo parametro in tutti i casi. Per evitare tale comportamento possiamo valutare di utilizzare nella stored procedure l’opzione WITH RECOMPILE. Tale implementazione risulta particolarmente utile nei casi in cui i parametri assumono valori con cardinalità molto differenti all’interno delle rispettive colonne.

 

Articoli correlati

Scopri cinque fondamentali differenze tra Oracle e Sql Server per lavorare correttamente su entrambi gli ambienti.

Source