这可能取决于索引的配置方式和表中的数据,但对于一个简单的测试用例,可以证明它们可以在 SQL Server 2005 中创建相同的查询计划。
以下代码在 SQL Server 2005 实例上运行,为查询的 OR、IN 和不等式版本生成了相同的查询计划。每个查询产生相同数量的记录。第一组查询使用 3 值均等分布。第二组查询使用 10 值均等分布。
CREATE TABLE #Test (TestID int, TestTypeID int);
WITH TallyTable AS
(
SELECT
TOP 10000
ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS Tally
FROM sys.objects s1
CROSS JOIN sys.objects s2
), InsertList AS
(
SELECT
Tally AS TestID,
Tally % 3 AS TestTypeID
FROM TallyTable
)
INSERT INTO #Test
(
TestID,
TestTypeID
)
SELECT
TestID,
TestTypeID
FROM InsertList;
SELECT
TestTypeID
FROM #Test
WHERE TestTypeID = 0
OR TestTypeID = 2;
SELECT
TestTypeID
FROM #Test
WHERE TestTypeID IN (0,2);
SELECT
TestTypeID
FROM #Test
WHERE TestTypeID <> 1;
CREATE INDEX TestIndex ON #Test (TestTypeID);
SELECT
TestTypeID
FROM #Test
WHERE TestTypeID = 0
OR TestTypeID = 2;
SELECT
TestTypeID
FROM #Test
WHERE TestTypeID IN (0,2);
SELECT
TestTypeID
FROM #Test
WHERE TestTypeID <> 1;
DROP INDEX TestIndex ON #Test;
TRUNCATE TABLE #Test;
WITH TallyTable AS
(
SELECT
TOP 10000
ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS Tally
FROM sys.objects s1
CROSS JOIN sys.objects s2
), InsertList AS
(
SELECT
Tally AS TestID,
Tally % 10 AS TestTypeID
FROM TallyTable
)
INSERT INTO #Test
(
TestID,
TestTypeID
)
SELECT
TestID,
TestTypeID
FROM InsertList;
SELECT
TestTypeID
FROM #Test
WHERE TestTypeID = 0
OR TestTypeID = 2
OR TestTypeID = 3
OR TestTypeID = 4
OR TestTypeID = 5
OR TestTypeID = 6
OR TestTypeID = 7
OR TestTypeID = 8
OR TestTypeID = 9;
SELECT
TestTypeID
FROM #Test
WHERE TestTypeID IN (0,2,3,4,5,6,7,8,9);
SELECT
TestTypeID
FROM #Test
WHERE TestTypeID <> 1;
CREATE INDEX TestIndex ON #Test (TestTypeID);
SELECT
TestTypeID
FROM #Test
WHERE TestTypeID = 0
OR TestTypeID = 2
OR TestTypeID = 3
OR TestTypeID = 4
OR TestTypeID = 5
OR TestTypeID = 6
OR TestTypeID = 7
OR TestTypeID = 8
OR TestTypeID = 9;
SELECT
TestTypeID
FROM #Test
WHERE TestTypeID IN (0,2,3,4,5,6,7,8,9);
SELECT
TestTypeID
FROM #Test
WHERE TestTypeID <> 1;
DROP TABLE #Test;
该集合使用 3 值不等分布,也产生相同的查询计划。
CREATE TABLE #Test (TestID int, TestTypeID int);
WITH TallyTable AS
(
SELECT
TOP 10000
ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS Tally
FROM sys.objects s1
CROSS JOIN sys.objects s2
), InsertList AS
(
SELECT
Tally AS TestID,
CASE
WHEN Tally % 1000 = 0 THEN 2
WHEN Tally % 100 = 1 THEN 1
ELSE 0
END AS TestTypeID
FROM TallyTable
)
INSERT INTO #Test
(
TestID,
TestTypeID
)
SELECT
TestID,
TestTypeID
FROM InsertList;
SELECT
TestTypeID
FROM #Test
WHERE TestTypeID = 0
OR TestTypeID = 2;
SELECT
TestTypeID
FROM #Test
WHERE TestTypeID IN (0,2);
SELECT
TestTypeID
FROM #Test
WHERE TestTypeID <> 1;
CREATE INDEX TestIndex ON #Test (TestTypeID);
SELECT
TestTypeID
FROM #Test
WHERE TestTypeID = 0
OR TestTypeID = 2;
SELECT
TestTypeID
FROM #Test
WHERE TestTypeID IN (0,2);
SELECT
TestTypeID
FROM #Test
WHERE TestTypeID <> 1;
DROP TABLE #Test;