Index-Tuning

關於索引“where”“order by”和“join”的列順序的簡單範例

  • August 27, 2021

這裡有兩個大表和一個相關查詢,目前沒有非聚集索引:

表 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更困難:
  1. 如果連接是唯一匹配(只有一個可能的連接匹配來自Table2),那麼將它放在第一位會更好。

鑑於您目前的查詢,只有在Table2.

這意味著可以查找連接列,並且最終結果的順序已經正確,不需要排序。它甚至可以來之前WHERECOLUMN

Table1 (WHERECOLUMN, JOINCOLUMN, ORDERCOLUMN) INCLUDE (SELECTCOLUMN)
-- alternately
Table1 (JOINCOLUMN, WHERECOLUMN, ORDERCOLUMN) INCLUDE (SELECTCOLUMN)
  1. 如果結果集的基數很小,這同樣適用於非唯一連接,在這種情況下,將需要排序但不會產生很大影響。在這種情況下,您放置ORDERCOLUMNINCLUDE
Table1 (WHERECOLUMN, JOINCOLUMN) INCLUDE (SELECTCOLUMN, ORDERCOLUMN)
  1. 如果最終結果集的基數很大,那麼ORDERCOLUMN首先放置會更好。然後,您可以將其放置JOINCOLUMNINCLUDE也。
Table1 (WHERECOLUMN, ORDERCOLUMN) INCLUDE (SELECTCOLUMN, JOINCOLUMN)

引用自:https://dba.stackexchange.com/questions/298613