COLLATE e SARGABLE

Ben ritrovati!

Anche oggi articolo leggero leggero..


Continuiamo con  il discorso di ieri che trovate qui: SQL Server: Come fare ricerche CASE SENSITIVE

Abbiamo visto come eseguire una ricerca CASE SENSITIVE anche se il database non lo è.

Abbiamo visto infatti che possiamo sfruttare la COLLATE per ottenere il risultato voluto.
Ad esempio scrivendo una Query così:


SELECT * FROM ELENCO WHERE CODICE COLLATE SQL_Latin1_General_CP1_CS_AS = 'luca'

La domandi di oggi è la seguente:

Ma se specifico una COLLATE nella WHERE, la stringa SQL che ottengo, è SARGABLE? 

 

La collate è Sargable?

Vediamolo, eseguiamo quindi la nostra Query e guardiamone il piano di esecuzione...

 

Che ne dite?

Sul campo CODICE esiste un indice non clustered.  

Di questo indice però ne viene fatta la scansione (SCAN) e non la SEEK e quindi la nostra Query NON E' SARGABLE!

SQL Server sarà costretto a scorrersi e leggersi tutto l'indice e come risultato avremo scarse performance!


Warning!


Occorre prestare sempre attenzione alla presenza di un simbolo di warning nel piano di esecuzione.

In questo caso ci avverte che per come è scritta la Query è presente un operazione di conversione implicita.

SQL Server dovrà infatti convertire uno dei due campi applicando la collate prima di fare il confronto.

Ma le operazioni di conversione disabilitano la ricerca in SEEK negli indici.



Bene, per oggi è tutto!
Con l'articolo di oggi vi saluto, l'intera redazione al completo (cioè me!) si prende qualche giorno di rigenerante relax montano.
Approfittatene se volete per rileggere gli articoli passati.


A presto!

Luca Biondi @ SQLServerPerformance blog!







Next post: Identificare la versione di SQL server? Semplice!

Previous post: SQL Server: Come fare ricerche CASE SENSITIVE

Comments

I Post più popolari

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

SQL Server, datetime vs. datetime2

La clausola NOLOCK. Approfondiamo e facciamo chiarezza!