我有以下两个表:
CREATE TABLE Test_Main
(
[ID] INT IDENTITY ,
[TypeID] INT ,
[BookID] INT
)
CREATE TABLE Test_Second
(
[TypeID] INT ,
[BookID] INT ,
[Value] INT,
)
INSERT INTO Test_Main(TypeID, BookID)
SELECT 1, 10
UNION
SELECT 2, 31
UNION
SELECT 3, 51
UNION
SELECT 4, 81
INSERT INTO Test_Second(TypeID, BookID, Value)
SELECT 1, 0, 30
UNION
SELECT 2, 31, 45
UNION
SELECT 3, 51, 66
UNION
SELECT 4, 0, 22
我有以下查询:
SELECT
ID ,
Test_Main.TypeID ,
Test_Main.BookID
FROM
Test_Main
INNER JOIN
Test_Second ON Test_Main.[TypeID] = Test_Second.[TypeID]
WHERE
Test_Main.BookID = CASE WHEN (Test_Main.BookID = 2 OR Test_Main.BookID = 3)
THEN Test_Second.BookID
ELSE Test_Main.BookID
END
此查询提供以下输出:
ID TypeID BookID
----------- ----------- -----------
1 1 10
2 2 31
3 3 51
4 4 81
现在,当我的表有百万行时,我怀疑我的case子句会导致性能问题。如何优化查询以使用索引查找。上述查询的索引应该是什么?
答案 0 :(得分:2)
您需要具备适当的指数:
TypeID
应该在两个表上建立索引(因为它在JOIN条件中使用)Test_Main.BookID
需要编入索引,因为它在WHERE子句中使用有了这三个索引,我相信你的查询应该可以很好地工作,即使表中有很多行!
答案 1 :(得分:0)
(问题:您确定在这部分中不是TypeID
而不是BookID
吗?):
... WHEN (Test_Main.TypeID = 2 OR Test_Main.TypeID = 3)
您的查询相当于:
SELECT
ID ,
Test_Main.TypeID ,
Test_Main.BookID
FROM
Test_Main
INNER JOIN
Test_Second ON Test_Main.[TypeID] = Test_Second.[TypeID]
WHERE
( Test_Main.BookID IN (2,3)
AND Test_Main.BookID = Test_Second.BookID
)
OR Test_Main.BookID NOT IN (2,3)
除了索引之外,你也可以检查这个版本的执行计划(以防万一,我不确定如何优化CASE
子句。