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

Hvorfor bruger denne forespørgsel ikke det korrekte indeks?

Den ved ikke, hvad værdien af ​​variablerne vil være, når den kompilerer forespørgslen. Du kan prøve OPTION (RECOMPILE) .

Jeg formoder, at tilføjelsen af ​​AND klausulen i forespørgslen (selvom den logisk nok ikke gør den mere selektiv overhovedet) skal vildlede optimeringsværktøjet til at estimere forespørgslen med større selektivitet og dermed give dig den plan, du ønskede!

Du siger i kommentarerne, at versionen uden ExceptionDate =ExceptionDate er estimeret til 88234.8 rækker og versionen med 8823.48

I mangel af brugbare statistikker falder SQL Server generelt tilbage til heuristik afhængig af typen af ​​sammenligningsoperator i prædikatet.

Det antager, at en > prædikat vil for eksempel returnere 30% af rækkerne, og at en = prædikat vil returnere 10% af rækkerne, så det ser ud til, at det bare anvender det direkte på resultatet af det første estimat. Interessant at den ikke tager højde for, at ligemænd er imod selve spalten her!

c.f. Bedste praksis til håndtering af statistik - Undgå brug af lokale variabler i forespørgsler



  1. Sortering efter rækkefølgen af ​​værdier i en SQL IN()-sætning

  2. Sådan finder du de datoformater, der bruges til et bestemt sprog i SQL Server (T-SQL)

  3. Oracle-forespørgsel for at matche alle værdier på listen blandt alle rækker i tabellen

  4. Skal MySQL have sin tidszone indstillet til UTC?