Для параметризованного запроса он не может просто выполнить два поиска
WHERE A=@P1 AND B=@P2 AND C=@P3 AND D=@P5
а также
WHERE A=@P1 AND B=@P2 AND C=@P4 AND D=@P5
Потому @P3 = @P4что, если это неправильно вернет дубликаты строк. Так что для этого потребуется оператор, который сначала удалит дубликаты из них.
Из быстрого теста этот конец, кажется, зависит от размера стола, получите вы это или нет. В приведенном ниже тесте 245/ 246rows - это точка отсечения между планами (это также была точка отсечения между индексом, размещающим все на одной странице, и он стал 2 листами листа и корневой страницей).
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 страница / 245 строк
Этот план имеет поиск A=1 AND B=2с остаточным предикатом на(C=@C1 OR C=@C2) AND D=5

2 листа страниц / 246 строк

Во втором плане дополнительные операторы несут ответственность за удаление любых дубликатов с @C1,@C2первого до выполнения поиска (ов).
Поиск во втором плане - это поиск диапазона между остаточным предикатом A=1 AND B=2 AND C > Expr1010и A=1 AND B=2 AND C < Expr1011с остаточным предикатом D=5. Это все еще не поиск равенства во всех 4 колонках. Более подробную информацию о дополнительных операторах плана можно найти здесь .
Добавление OPTION (RECOMPILE)действительно позволяет ему проверять значения параметров на наличие дубликатов во время компиляции и создает план с двумя поисками равенства.
Вы также можете достичь этого с
;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

Но на самом деле в этом тестовом примере это, скорее всего, будет контрпродуктивно, так как наличие двух поисков в индексе одной страницы вместо одного увеличивает логический ввод-вывод.
OPTION (RECOMPILE)?