索引外鍵的性能影響
我的數據庫用於帶有績效評估的 HR 應用程序,我對是否應該索引我的外鍵感興趣。
涉及兩個表。第一個是包含 2 列的評級表:
ID
(Integer, Primary Key) 和Description
(Varchar)。它只有 4 行(差、平均、高於平均和優秀)並且“永遠”不會改變。第二個表是複習表。每六個月每位員工將有 1 行。因此,我們正在查看數千個條目,而不是數百萬個條目。每行大約有 25 個評估欄位,它們是評級表的外鍵。範例是典型的問題,其中員工被評為按時完成工作,與他人合作良好等……
根據我的研究,似乎沒有任何真正的理由在每個鍵上創建索引,因為我永遠不會在評級表中添加和/或刪除。還有其他我應該考慮的因素嗎?還是我什麼都不擔心,因為 db 太小了?
SELECT
即使您“從不”更改任何值,在較大的表上建立索引以幫助優化器進行特定查詢仍然很有用。但是,如果沒有更多關於您的系統和您將執行的查詢類型的知識,我們中的任何人都很難告訴您是否應該在那裡有索引。恐怕這只是你必須測試的東西。
Erin Stellato 的這篇精彩文章的一些背景:
http://www.sqlperformance.com/2012/11/t-sql-queries/benefits-indexing-foreign-keys
在某些情況下,您還可以考慮避免連接 - 當您確定值永遠不會改變並且消除連接可以簡化執行計劃時,您可以只考慮內聯常量,例如
SELECT CASE RatingID WHEN 1 THEN 'poor' WHEN 2 THEN 'average' ... END FROM dbo.BiggerTable ...
另外我建議永遠不要命名某些東西
ID
。如果它是 a ,則在模型中存在的任何地方RatingID
呼叫它。RatingID
我的數據庫用於帶有績效評估的 HR 應用程序,我對是否應該索引我的外鍵感興趣。
一般來說,如果該列將出現在諸如
WHERE
子句或JOIN
謂詞之類的搜尋條件中,那麼它可能應該被索引。這取決於訪問表的確切查詢。在一個新建項目中,我的方法通常是不創建任何補充索引,直到我知道它們是必要的,通過在編寫新查詢時分析它們的查詢計劃。大多數時候,用於確保數據完整性的索引支持的約束足以有效地服務於大多數查詢。
涉及兩個表。第一個是包含 2 列的評級表:ID(整數,主鍵)和描述(Varchar)。它只有 4 行(差、平均、高於平均和優秀)並且“永遠”不會改變。
除非有緩解的情況,否則我建議使用 a
tinyint
作為該表的主鍵,因為這將為您在引用該表的更大表中節省大量儲存空間。(這個項目的絕對值可能不多,但總的來說,這是一個好主意。)第二個表是複習表。每六個月每位員工將有 1 行。因此,我們正在查看數千個條目,而不是數百萬個條目。每行大約有 25 個評估欄位,它們是評級表的外鍵。範例是典型的問題,其中員工被評為按時完成工作,與他人合作良好等……
我建議做一些工作來規範這個設計。根據您所說,我可以確定至少涉及 5 個表:
Employees Questions Ratings EmployeeEvaluations EmployeeEvaluationQuestionRatings
規範化工作應該首先完成,我認為在添加適當的表約束之後,您會發現關於索引和性能的問題在很大程度上消失了——或者變得更加明顯。