Sql-Server

您是否在 JOIN 子句或 where 子句或兩者上設置索引?

  • February 27, 2021

假設我的查詢如下所示:

SELECT t1, t2
FROM t1
 LEFT JOIN t2 ON (t1.id = t2.id AND t2.userid = @userid)
WHERE t1.enabled = 1 AND
     t1.startDate <= ??? AND 
     (t1.counter = -1 OR
      t2.counter IS NULL OR
      (t1.counter > t2.counter)

現在這個表可能有幾十萬行。

你會建議我像這樣在 JOIN 子句上放置一個索引嗎?

 t2.id t2.userid

where子句呢?還是連接子句更重要?

我意識到測試很重要,但理論上應該怎麼做?

(這適用於 SQL Server 2000)

我建議始終在將在條件中使用的列上放置一個非聚集索引JOIN- 外鍵列。這在幾個方面有幫助 -JOIN操作會更快,並且強制執行 FK 約束(在嘗試刪除父行時檢查是否附加了子行)也將從這些索引中受益。

然後檢查您的系統的性能。如果它的性能低於您的預期 - 請仔細添加一個索引,看看整體系統性能是否有所提高。如果不是:再次刪除索引。重複一遍,直到您對錶演感到滿意為止。WHEREor子句中使用的列ORDER BY是這些索引的主要候選者 - 但**不要過度索引!**這比根本沒有索引還要糟糕。

請參閱 Kimberly The Queen of Indexing Tripp 的優秀部落格文章 -索引:僅僅因為可以,並不意味著您應該!關於那個話題。

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