以往複合索引都只把重心放在第一個欄位的選擇,畢竟第一個欄位會影響到 index seek 是否會被使用,就沒有注意到剩下欄位順序,該情況是複合索引順序為 ADCB,TSQL 語法大略為
SELECT
...........
FROM TableName
WHERE 欄位A = 條件A
AND 欄位B = 條件B
AND 非Index欄位1 > 條件
WHERE 條件,用到複合索引的第一個和第四個欄位,missing index 建議複合索引順序以 AB 為首,簡單說就是把複合索引的前兩個欄位順序符合 WHERE 條件,修正複合索引順序後,statistics 因為都是跑 index seek 所以差異不大,但執行計畫從 0.74559 變成 0.33610,大概改善 45% 左右,該查詢剛好是該 Table 的主查詢語法,就直接把複合索引順序修正以 AdventureWorks2017 來模擬的話,情況大概如下語法
USE AdventureWorks2017
GO
DROP INDEX IF EXISTS [IX_LastName_FirstName_MiddleName] ON Person.Person
DROP INDEX IF EXISTS [IX_LastName_MiddleName_FirstName] ON Person.Person
GO
CREATE INDEX [IX_LastName_FirstName_MiddleName] ON Person.Person (LastName,FirstName,MiddleName);
CREATE INDEX [IX_LastName_MiddleName_FirstName] ON Person.Person (LastName,MiddleName,FirstName);
GO
-- WHERE 條件為複合索引的第一、二欄位
SELECT *
FROM Person.Person WITH (INDEX(IX_LastName_FirstName_MiddleName))
WHERE LastName = 'Reed'
AND FirstName = 'Gabriella'
-- WHERE 條件為複合索引的第一、三欄位
SELECT *
FROM Person.Person WITH (INDEX(IX_LastName_MiddleName_FirstName))
WHERE LastName = 'Reed'
AND FirstName = 'Gabriella'
- 延伸閱讀
- [SQL] 複合索引 - 第一欄位
2 則留言:
可是調完之後其他用的AD的不會影響嗎
調整 index 一定會影響其他 Query,該 case 剛好是該商業邏輯的主 Query 語法
張貼留言