2016-06-21 8 views
3

Ich habe eine relativ einfach query:Warum erstellt mein Abfrageplan einen Index-Scan?

SELECT o.id 
    FROM dbo.table1 o 
    LEFT JOIN dbo.table2 n (NOLOCK) 
     ON o.first = n.second and n.first = @Var1 
    WHERE 
     (o.fourth in (@Var4, @Var5) or o.fifth = @Var6) AND 
     (o.first = @Var1 or n.first = @Var1) AND 
     (
      o.second = @Var2 OR 
      o.second like (@Var2 + '[^a-zA-Z]%') OR 
      o.third like (@Var3 + '[^a-zA-Z]%') 
     ) 

Aber immer, wenn ich die Abfrage-Plan überprüfen, ich einen Index-Scan tue.

Der nicht gruppierten Index ich habe, ist (auf Tabelle 1):

First ASC, 
Fourth ASC, 
Fifth ASC, 
Second ASC, 
Third ASC 

Include: id 

Warum ein Scan? Bedeckt das nicht mein Index? Ich habe auch die richtigen Indizes für Tabelle2, also mache ich mir keine Sorgen.

Vielen Dank für jede Hilfe

Antwort

1

Die einzigen Orte, wo man die First Spalte von Tabelle 1 verwenden sind an Orten, wo ein Fehler ein Spiel haben, nicht unbedingt ein Fehler für die gesamte Abfrage ist

  • innerhalb des ON eines LEFT JOIN
  • nur auf einer Seite eines OR Operator

Daher kann nicht Nutzen von der Verwendung eines Index mit First als die erste Spalte starten, da buchstäblich jeder Wert in dieser Spalte ein gültiger Teil des Endergebnisses sein kann.

+0

Sinn macht. In diesem Fall habe ich keinen konkreten Ausgangspunkt. Wäre das Umschreiben der Abfrage eine bessere Option? – user2124871

+0

@ user2124871 - schwer zu sagen, wenn alles so abstrakt ist. Wenn die Abfrage * logisch korrekt ist *, dann hat jede logische Neuerung, die auch logisch korrekt ist, wahrscheinlich genau denselben Abfrageplan. –

+0

Also habe ich versucht, das Problem zu umgehen, aber genau wie du gesagt hast, habe ich den gleichen Abfrageplan. Die nächste Lösung besteht darin, dies in separate Abfragen aufzuteilen und die Ergebnisse zu verknüpfen. Vielen Dank für Ihren Beitrag - schätzen Sie es. – user2124871

Verwandte Themen