Index-Tuning
關於索引“where”“order by”和“join”的列順序的簡單範例
這裡有兩個大表和一個相關查詢,目前沒有非聚集索引:
表 1 有 4 列
ID (cluster index) JOINCOLUMN SELECTCOLUMN WHERECOLUMN ORDERCOLUMN
表2有很多列
ID (cluster index) JOINCOLUMN other columns....
詢問:
SELECT TABLE1.SELECTCOLUMN FROM TABLE1 INNER JOIN TABLE2 ON TABLE1.JOINCOLUMN = TABLE2.JOINCOLUMN WHERE TABLES1.WHERECOLUMN = 'A' ORDER BY TABLES1.ORDERCOLUMN
我嘗試通過添加非聚集索引開始調整,我應該從這個開始:我可以將“索引 1”與“索引 2”結合起來嗎?
- 表 1 上的“索引 1”:列:WHERECOLUMN、ORDERCOLUMN,包括 SELECTCOLUMN。
- 表 1 上的“索引 2”:列:JOINCOLUMN
- 表 2 上的“索引 3”:列:JOINCOLUMN
表格1:
(WHERECOLUMN, -- 1st for filtering ORDERCOLUMN, -- 2nd for having the index handle the ORDER BY INCLUDE (SELECTCOLUMN, JOINCOLUMN) -- for covering; the order does not matter
我沒有放第一
JOINCOLUMN
或第二是因為我希望索引中的連續行與滿足查詢所需的連續行完全匹配。表 2——用於加入並有效地涵蓋:
(JOINCOLUMN)
有時甚至更好地擺脫 TABLE1.ID 並將其用作聚集索引:
(WHERECOLUMN, ORDERCOLUMN)
因為
Table2
索引很明顯:Table2 (JOINCOLUMN)
因為
Table1
您應該只創建一個索引。問題是按什麼順序。
WHERECOLUMN
當然應該是第一位的。這是因為查找Table1
首先需要對WHERECOLUMN
.SELECTCOLUMN
可以是INCLUDE
列,不需要在鍵中。如果是這樣,它應該排在最後。JOINCOLUMN
在和之間進行選擇ORDERCOLUMN
更困難:
- 如果連接是唯一匹配(只有一個可能的連接匹配來自
Table2
),那麼將它放在第一位會更好。鑑於您目前的查詢,只有在
Table2
.這意味著可以查找連接列,並且最終結果的順序已經正確,不需要排序。它甚至可以來之前
WHERECOLUMN
。Table1 (WHERECOLUMN, JOINCOLUMN, ORDERCOLUMN) INCLUDE (SELECTCOLUMN) -- alternately Table1 (JOINCOLUMN, WHERECOLUMN, ORDERCOLUMN) INCLUDE (SELECTCOLUMN)
- 如果結果集的基數很小,這同樣適用於非唯一連接,在這種情況下,將需要排序但不會產生很大影響。在這種情況下,您放置
ORDERCOLUMN
為INCLUDE
Table1 (WHERECOLUMN, JOINCOLUMN) INCLUDE (SELECTCOLUMN, ORDERCOLUMN)
- 如果最終結果集的基數很大,那麼
ORDERCOLUMN
首先放置會更好。然後,您可以將其放置JOINCOLUMN
為INCLUDE
也。Table1 (WHERECOLUMN, ORDERCOLUMN) INCLUDE (SELECTCOLUMN, JOINCOLUMN)