Sql-Server
您是否在 JOIN 子句或 where 子句或兩者上設置索引?
假設我的查詢如下所示:
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 約束(在嘗試刪除父行時檢查是否附加了子行)也將從這些索引中受益。然後檢查您的系統的性能。如果它的性能低於您的預期 - 請仔細添加一個索引,看看整體系統性能是否有所提高。如果不是:再次刪除索引。重複一遍,直到您對錶演感到滿意為止。
WHERE
or子句中使用的列ORDER BY
是這些索引的主要候選者 - 但**不要過度索引!**這比根本沒有索引還要糟糕。請參閱 Kimberly The Queen of Indexing Tripp 的優秀部落格文章 -索引:僅僅因為可以,並不意味著您應該!關於那個話題。