sql server - Cosa rende sargable un'istruzione SQL?




sql server 2016 optimization (3)

Per definizione (almeno da quello che ho visto) sargable significa che una query è in grado di fare in modo che il motore di query ottimizzi il piano di esecuzione utilizzato dalla query. Ho provato a cercare le risposte, ma non sembra esserci molto sull'argomento. Quindi la domanda è, che cosa fa o non rende una query SQL sargable? Qualsiasi documentazione sarebbe molto apprezzata.

Per riferimento: Sargable


Affinché un'operazione possa essere considerata sargabile, non è sufficiente che sia in grado di utilizzare un indice esistente. Nell'esempio sopra riportato, l'aggiunta di una chiamata di funzione a una colonna indicizzata nella clausola where, potrebbe molto probabilmente avvantaggiarsi dell'indice definito. "Scansionerà", ovvero recupererà tutti i valori da quella colonna (indice) e quindi eliminerà quelli che non corrispondono al valore del filtro fornito. Non è ancora abbastanza efficiente per le tabelle con un numero elevato di righe. Ciò che veramente definisce sargability è la capacità di query di attraversare l'indice b-tree utilizzando il metodo di ricerca binaria che si basa sull'eliminazione di metà set per l'array di elementi ordinati. In SQL, sarebbe visualizzato nel piano di esecuzione come "ricerca indice".


In questa risposta presumo che il database abbia indici di copertura sufficienti. Ci sono abbastanza domande su questo argomento .

Molte volte la sargibilità di una query è determinata dal punto di non ritorno degli indici correlati. Il punto di non ritorno definisce la differenza tra la ricerca e la scansione di un indice mentre si aggiunge una tabella o un set di risultati a un altro. Ovviamente, una ricerca è molto più veloce della scansione di un intero tavolo, ma quando si devono cercare molte righe, una scansione potrebbe avere più senso.

Quindi, tra le altre cose un'istruzione SQL è più sillababile quando l'ottimizzatore si aspetta che il numero di righe risultanti di una tabella sia inferiore al punto di non ritorno di un possibile indice sulla tabella successiva.

Puoi trovare un post dettagliato ed un esempio here .


Non farlo:

WHERE Field LIKE '%blah%'

Ciò causa una scansione tabella / indice, poiché il valore LIKE inizia con un carattere jolly.

Non farlo:

WHERE FUNCTION(Field) = 'BLAH'

Ciò causa una scansione tabella / indice.

Il server di database dovrà valutare FUNCTION () su ogni riga della tabella e quindi confrontarlo con 'BLAH'.

Se possibile, fallo al contrario:

WHERE Field = INVERSE_FUNCTION('BLAH')

Questo eseguirà INVERSE_FUNCTION () rispetto al parametro una volta e consentirà comunque l'uso dell'indice.





performance