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:
Accounts.AccountNumber
Accounts.AccountNumber
-Spalte ist ein Nullwert varchar(30)
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.
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
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
):
Tags und Links sql wildcard sql-server-2012 sql-execution-plan sql-like