Una domanda sulla SARGability


11

Devo solo confermare di aver capito qualcosa correttamente:

Di recente ho visualizzato una domanda SO in cui un utente ha pubblicato una risposta in Linq come:

from p in db.table where p.column.AddMinutes(1) > DateTime.Now select p

Per coloro che non hanno familiarità con Linq, mi aspetto che l'output di tale affermazione (non testato in modo equo) sia:

SELECT *
FROM table t
WHERE DATEADD(min, 1, t.column) >= GETDATE() 

Ho pubblicato una risposta a questo dicendo che la manipolazione del datetime dovrebbe essere sulla variabile (in questo caso GETDATE()), quindi in realtà l'affermazione dovrebbe riflettere qualcosa come:

SELECT *
FROM table t
WHERE t.column >= DATEADD(min, -1, GETDATE())

Nella mia risposta, i bit di cui ora non sono sicuro, assumono quanto segue:

  1. Gli indici non verranno utilizzati a causa della manipolazione della colonna
  2. I piani di query saranno diversi in parte a causa di quanto sopra (non testato, presupponendolo)
  3. A causa di quanto sopra, la prima query avrà effettivamente prestazioni peggiori rispetto alla seconda.

La mia domanda:

Ho perso qualcosa nel mio ragionamento? Ho ragione? Infine, qualche organismo ha buoni articoli sulla SARGability?

Risposte:


6
  1. corretta
  2. non necessariamente: dipende dall'esistenza di un indice adatto e dalla decisione del CBO di utilizzarlo. Ad esempio, se la tabella è piccola o le statistiche portano l'ottimizzatore a credere che il filtro sarà vero per una grande percentuale dei risultati, potrebbe considerare il costo di un FTS più basso
  3. ciò non è garantito - è anche possibile che la seconda query abbia prestazioni peggiori - ma il tuo ragionamento è fondamentalmente corretto. Ad esempio, in un caso limite quando un FTS sarebbe effettivamente più veloce, il CBO potrebbe scegliere una scansione dell'indice invece in base alla sua migliore ipotesi del costo - che è sempre solo una stima ovviamente

Un po 'di googling ha sollevato questa domanda SO e questo interessante articolo sulla SARGability


5

Jack ha ragione, quindi non lo ripeterò.

Aggiungerò solo alcuni articoli che mi piacciono per quanto riguarda la sargibilità di un'espressione:

Sono tutti grandi scrittori con molta esperienza di SQL Server.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.