Untuk kueri parameterised, ia tidak bisa hanya melakukan dua pencarian saja
WHERE A=@P1 AND B=@P2 AND C=@P3 AND D=@P5
dan
WHERE A=@P1 AND B=@P2 AND C=@P4 AND D=@P5
Karena jika @P3 = @P4
itu salah akan mengembalikan baris duplikat. Jadi perlu operator yang menghapus duplikat dari ini terlebih dahulu.
Dari tes cepat akhir ini tampaknya tergantung pada ukuran tabel apakah Anda mendapatkannya atau tidak. Dalam tes di bawah 245
/ 246
baris adalah titik cut off antara rencana (ini juga merupakan titik cut off antara indeks yang cocok semua pada satu halaman dan itu menjadi 2 halaman daun dan halaman root).
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 Halaman / 245 baris
Rencana ini memiliki pencarian A=1 AND B=2
dengan predikat residu aktif(C=@C1 OR C=@C2) AND D=5
2 lembar daun / 246 baris
Dalam paket kedua, operator tambahan bertanggung jawab untuk menghapus duplikat dari yang @C1,@C2
pertama sebelum melakukan pencarian.
Pencarian dalam rencana kedua sebenarnya adalah kisaran pencarian antara A=1 AND B=2 AND C > Expr1010
dan A=1 AND B=2 AND C < Expr1011
dengan predikat residu aktif D=5
. Itu masih bukan pencarian kesetaraan di semua 4 kolom. Informasi lebih lanjut tentang operator paket tambahan dapat ditemukan di sini .
Menambahkan OPTION (RECOMPILE)
memang memungkinkan untuk memeriksa nilai parameter untuk duplikat pada waktu kompilasi dan menghasilkan rencana dengan dua upaya kesetaraan.
Anda juga bisa mencapainya dengan
;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
Tetapi sebenarnya dalam kasus uji ini kemungkinan akan menjadi kontra produktif karena memiliki dua berusaha ke dalam indeks halaman tunggal daripada satu meningkatkan IO logis.
OPTION (RECOMPILE)
?