sql >> Database >  >> RDS >> Sqlserver

Waarom gebruikt deze query niet de juiste index?

Het weet niet wat de waarde van de variabelen zal zijn wanneer het de query compileert. Je zou kunnen proberen OPTION (RECOMPILE) .

Ik neem aan dat de toevoeging van de AND clausule in de zoekopdracht (ook al maakt het deze logischerwijs helemaal niet selectiever) moet de optimiser misleiden om de zoekopdracht met grotere selectiviteit te schatten, waardoor u het plan krijgt dat u wilde!

U zegt in de opmerkingen dat de versie zonder de ExceptionDate = ExceptionDate wordt geschat op 88234.8 rijen en de versie met 8823.48

In het algemeen valt SQL Server bij het ontbreken van bruikbare statistieken terug op heuristieken, afhankelijk van het type vergelijkingsoperator in het predikaat.

Het gaat ervan uit dat een > predikaat zal bijvoorbeeld 30% van de rijen retourneren en dat een = predikaat retourneert 10% van de rijen, dus het lijkt erop dat het dat rechtstreeks toepast op het resultaat van de eerste schatting. Interessant dat het geen rekening houdt met het feit dat de gelijken hier tegen de kolom zelf zijn!

vgl. Best practices voor het beheren van statistieken - Vermijd het gebruik van lokale variabelen in query's



  1. De eigenschap ConnectionString is niet geïnitialiseerd fout

  2. LIKE-opdracht Mysql

  3. MySQL DATE-veld met standaard CURDATE(). NIET DATUM

  4. CASE versus DECODE