2011-08-20 139 views
0

我有以下兩個表:SQL:關於查詢優化的問題

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 

現在,當我的表有100萬行時,我懷疑我的case子句會導致性能問題。我如何優化查詢以使用索引查找。上述查詢的索引應該是什麼?

回答

2

你需要有適當的指標到位:

  • TypeID應在兩個表進行索引(因爲它在連接狀態下使用)
  • Test_Main.BookID需要被索引,因爲它的在WHERE子句中使用

有了這三個索引,我相信你的查詢應該可以很好地工作,即使表中有很多行!

+0

你認爲'(TypeID,BookID)'上的compoun索引會被使用嗎(並有助於提高效率)? –

+0

@ypercube:它將用於'TypeID'上的查詢 - 但添加'BookID'並不真正有幫助,我會想;這個複合索引可能**不能用於單獨使用'BookID'的查詢。 –

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子句可以優化多少)。