Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL Server non usa un indice che confronta datetime con non null

E 'normale. Non utilizzerà l'indice a meno che il predicato non sia sufficientemente selettivo da giustificarlo.

Sembra che la stragrande maggioranza dei record non sia NULL, quindi invece di trovarli tramite l'indice non cluster, quindi dover eseguire un sacco di ricerche di segnalibri e I/O casuali per recuperare il resto delle colonne per restituirlo è più rapido ed efficiente scansiona l'intero indice cluster.

Puoi usare FORCESEEK per forzare il comportamento che dici di volere. Probabilmente scoprirai che il tempo impiegato e le statistiche di I/O superano il tetto della scansione dell'indice cluster.

SET STATISTICS IO ON

SELECT * FROM 
YourTable WITH (FORCESEEK) 
WHERE YourCol IS NOT NULL