Für eine parametrisierte Abfrage Es können nicht nur zwei Suchvorgänge ausgeführt werden
WHERE A=@P1 AND B=@P2 AND C=@P3 AND D=@P5
und
WHERE A=@P1 AND B=@P2 AND C=@P4 AND D=@P5
Denn wenn @P3 = @P4
das fälschlicherweise doppelte Zeilen zurückbringen würde. Es würde also einen Operator benötigen, der zuerst Duplikate von diesen entfernt.
Nach einem kurzen Test zu diesem Zweck scheint es von der Größe der Tabelle abhängig zu sein, ob Sie diese erhalten oder nicht. Im Test unten 245
/ 246
Zeilen ist der Grenzpunkt zwischen Plänen (dies war auch der Grenzpunkt zwischen dem Index, der alle auf einer Seite anpasst und 2 Blattseiten und eine Stammseite wird).
CREATE TABLE T(A INT,B INT,C INT,D INT)
INSERT INTO T
SELECT TOP (245) 1,2,3,5
FROM master..spt_values v1
CREATE CLUSTERED INDEX IX ON T(A, B, C, D)
SELECT index_level,page_count, record_count
FROM sys.dm_db_index_physical_stats(db_id(),object_id('T'),1,NULL, 'DETAILED')
DECLARE @C1 INT = 3,
@C2 INT = 4
SELECT * FROM T WHERE A=1 AND B=2 AND (C=@C1 OR C=@C2) AND D=5
DROP TABLE T
1 Seiten / 245 Zeilen
Dieser Plan hat eine Suche A=1 AND B=2
mit einem Restprädikat auf(C=@C1 OR C=@C2) AND D=5
2 Blattseiten / 246 Reihen
Im zweiten Plan sind die zusätzlichen Operatoren dafür verantwortlich, alle Duplikate von den @C1,@C2
ersten zu entfernen, bevor die Suche (n) durchgeführt werden.
Die Suche im zweiten Plan ist tatsächlich eine Bereichssuche zwischen A=1 AND B=2 AND C > Expr1010
und A=1 AND B=2 AND C < Expr1011
mit einem verbleibenden Prädikat D=5
. Es ist immer noch keine Gleichstellungssuche für alle 4 Spalten. Weitere Informationen zu den zusätzlichen Planbetreibern finden Sie hier .
Durch Hinzufügen können OPTION (RECOMPILE)
die Parameterwerte zur Kompilierungszeit auf Duplikate überprüft werden, und es wird ein Plan mit zwei Gleichheitssuchen erstellt.
Das könnte man auch mit erreichen
;WITH CTE
AS (SELECT DISTINCT ( C )
FROM (VALUES (@C1),
(@C2)) V(C))
SELECT CA.*
FROM CTE
CROSS APPLY (SELECT *
FROM T
WHERE A=1 AND B=2 AND D=5 AND C = CTE.C) CA
In diesem Testfall wäre es jedoch wahrscheinlich kontraproduktiv, wenn zwei Suchvorgänge im Index einer einzelnen Seite und nicht einer das logische E / A erhöhen.
OPTION (RECOMPILE)
?