sql:关于查询优化的问题

时间:2011-08-20 13:07:21

标签: sql sql-server sql-server-2005 indexing

我有以下两个表:

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子句会导致性能问题。如何优化查询以使用索引查找。上述查询的索引应该是什么?

2 个答案:

答案 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子句。