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

Perché questa query non utilizza l'indice corretto?

Non sa quale sarà il valore delle variabili quando compila la query. Potresti provare OPTION (RECOMPILE) .

Presumo che l'aggiunta di AND La clausola nella query (anche se logicamente non la rende affatto più selettiva) deve indurre l'ottimizzatore a stimare la query con maggiore selettività dandoti così il piano che volevi!

Nei commenti dici che la versione senza ExceptionDate = ExceptionDate è stimato in 88234.8 righe e la versione con 8823.48

In genere, in assenza di statistiche utilizzabili, SQL Server ricorre all'euristica dipendente dal tipo di operatore di confronto nel predicato.

Presuppone che un > predicato restituirà ad esempio il 30% delle righe e che un = predicato restituirà il 10% delle righe, quindi sembra che lo stia semplicemente applicando direttamente al risultato della prima stima. Interessante che non tenga conto del fatto che il pari è contro la colonna stessa qui!

cfr Best practice per la gestione delle statistiche:evitare l'uso di variabili locali nelle query