Wie kann '% ...' nach einem Index suchen?

8

Ich würde erwarten, dass diese beiden SELECT s den gleichen Ausführungsplan und dieselbe Leistung haben. Da es auf dem LIKE einen führenden Platzhalter gibt, erwarte ich einen Index-Scan. Wenn ich das hier ausführe und mir die Pläne ansehe, verhält sich das erste SELECT wie erwartet (mit einem Scan). Aber der zweite SELECT -Plan zeigt eine Indexsuche und läuft 20-mal schneller.

Code:

%Vor%

Frage:

Wie verwendet SQL Server eine Indexsuche, wenn das Muster mit einem Platzhalterzeichen beginnt?

Bonusfrage:

Warum ändert / verbessert die Verkettung einer leeren Zeichenkette den Ausführungsplan?

Details:

  • Es gibt einen nicht gruppierten Index für Accounts.AccountNumber
  • Es gibt andere Indizes, aber sowohl der Suchvorgang als auch der Scan befinden sich auf diesem Index.
  • Die Accounts.AccountNumber -Spalte ist ein Nullwert varchar(30)
  • Der Server ist SQL Server 2012

Tabellen- und Indexdefinitionen:

%Vor%

HINWEIS: Hier ist der tatsächliche Ausführungsplan für die zwei Abfragen. Die Namen der Objekte unterscheiden sich geringfügig vom obigen Code, weil ich versucht habe, die Frage einfach zu halten.

    
pants 05.08.2013, 19:20
quelle

1 Antwort

7

Diese Tests (Datenbank AdventureWorks2008R2) zeigt, was passiert:

%Vor%

Ergebnisse:

%Vor%

Die Ergebnisse von SET STATISTICS IO zeigen, dass LIO die gleich sind. Aber die Ausführungspläne sind ziemlich unterschiedlich:

Im ersten Test verwendet SQL Server Index Scan explizit, aber im zweiten Test verwendet SQL Server Index Seek , was ein Index Seek - range scan ist. Im letzten Fall verwendet SQL Server einen Operator Compute Scalar , um diese Werte zu generieren

%Vor%

und der Operator Index Seek verwenden Seek Predicate (optimiert) für range scan ( LastName > LikeRangeStart AND LastName < LikeRangeEnd ) plus eine weitere nicht optimierte Predicate ( LastName LIKE @pattern ).

  

Wie kann LIKE '% ...' nach einem Index suchen?

Meine Antwort: Es ist kein "echtes" Index Seek . Es ist ein Index Seek - range scan , das in diesem Fall die gleiche Leistung wie Index Scan hat.

Siehe auch den Unterschied zwischen Index Seek und Index Scan (ähnliche Debatte): Also ... ist es eine Suche oder ein Scan? .

Edit 1: Der Ausführungsplan für OPTION(RECOMPILE) (siehe bitte Aarons Empfehlung) zeigt auch ein Index Scan (anstelle von Index Seek ):

    
Bogdan Sahlean 05.08.2013, 20:07
quelle