我正在改進一些SQL查詢腳本的性能。例如:索引字段和索引與包含字段之間的差異
SELECT *
FROM Book b, Library l, [Order] o
WHERE o.bookid = b.bookID
AND o.mode = 'A'
AND o.library_ID = l.library_ID
AND l.library_ID > 19
AND b.publisher_id > 1000
AND b.print_id > 800
AND NOT EXISTS (
SELECT *
FROM ExtBOOK
WHERE b.bookid = extbookid
AND library_ID = l.library_ID
)
AND o.activated = 'Y'
AND b.eisbn13 LIKE '978%'
AND len(o.ext_user_id) > 3
AND b.bookid > 200000
AND b.bookid in (
SELECT bookid
FROM category
WHERE categoryid > 2
)
ORDER BY o.orderid DESC
當我搜索在SQL Management Studio中使用此SQL腳本「包括實際的執行計劃」,結果讓我補充以下指數
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[Order] ([MODE],[ACTIVATED],[LIBRARY_ID],[BOOKID])
INCLUDE ([OrderID],[EXT_USER_ID],[APPROVAL_DATE])
Howevery如果我刪除一些有條件的地方,如下圖所示:
SELECT * FROM Book b, Library l, [Order] o
WHERE o.bookid = b.bookID
AND o.mode = 'A'
AND o.library_ID = l.library_ID
AND l.library_ID > 19
ORDER BY o.orderid DESC
我得到了另一個不同的推薦,如下圖所示:
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[ORDER] ([MODE])
INCLUDE ([LIBRARY_ID],[BOOKID])
因爲條件是可變的,我應該創建哪個索引?我理解索引是做什麼的,但不是索引字段和被包含字段之間的好處。爲什麼在第一個建議索引中,BOOKID和LIBRARY_ID位於索引字段中,但在第二個建議索引中,BOOKID和LIBRARY_ID位於包含字段中?有什麼區別,我應該用什麼來涵蓋所有可能的條件?
另外,從我的測試中,我添加了其中的每一個來測試性能,但看不到任何區別。我感謝任何幫助。
**索引列**是實際的索引導航結構的一部分,例如你可以在'WHERE'子句中使用它們。 **包含的**列只存在於索引的葉級別 - 您不能使用它們來選擇行 - 並且它們在那裏,因此您的查詢可以從索引結構中滿足(查詢請求的所有列),因此您無需對實際表格數據進行昂貴的密鑰查找即可獲得您需要的一個或兩個額外列。 –
@danmiao:哪個表是別名「m」引用(m.libary_ID = l.library_ID)?這是一個錯字或查詢中是否有另一個表? – 8kb
嗨8kb,對不起,這是我的打字錯誤,它是'o',我已經更新,謝謝 – danmiao