2009-10-29 74 views
0

我是一個正常的「將是DBA」級開發人員。我一直在處理一些有數百萬條記錄的數據庫。在數據庫及其克隆之間導入數據很多,然後在Web應用程序環境中使用該克隆。分配FK索引有多值得?

那麼,我知道保持PK索引自動,所以它有助於加快數據訪問。現在,從這個討論中我得出,如果我在我的SQL查詢中使用JOIN,那麼我會使用FK並對其進行索引以使JOIN操作有效。

例如,我有一個表OrgMaster(包含所有組織記錄),那麼我有一個BookingMaster表(包含所有預訂記錄)。現在,OrmaMaster.Id被「引用」爲BookingMaster.OrgId。所以,我有一個用於OrgId-Id關係的FK,並且爲了在這兩個表格之間的任何JOIN操作獲得更好的性能,我都會'索引'它。我是否正確地得到它?

以上所有 - 以額外的空間和時間開銷爲代價(用FK在表中插入記錄)。

我會要求你提供我要考慮的點的列表,如:

  • 是FK-指數要吃掉作爲表的增長几百萬條記錄太多空間\時間?
  • 在這種情況下,是否值得去FK索引「每次」?
  • 在什麼情況下shud我不適用FK或指數,或兩者都不它的(當然我可以處理從應用程序很多)

  • 任何其他棘手的加速比JOIN或其他這樣費時查找?

謝謝。

回答

2

您的問題:
是FK-指數會吃了太多的空間/時間作爲表的增長幾百萬條記錄?

無後顧之憂,在這裏,至少不是一個問題「隨着表的增長」。空間和時間要求將線性增加關於添加的記錄數量。
(以及技術上不大,如果你越過那條介紹在樹的記錄容易萬元的額外水平,但通常一個數據庫界限,樹的深度容易在那裏應該是)

在這種情況下,是否值得去FK-索引「每次?」

通常是,但它確實是個案情況。有人認爲也要考慮,而不是簡單的FK索引是包含附加列的索引,並且可以用於搜索和覆蓋選擇列表的[部分]。再次決定這種替代(或額外的指標)是個案,對不起;-) ...

在什麼情況下我應該不應用FK或索引它或不做任何它(當然我可以處理應用程序中的一個LOT)

當然,所有這些情況都不包括那些重要的參考完整性由dbms自身支持的重要參數(這樣的完整性可以在應用程序/進程級別進行管理其中插入和刪除數據庫中的行)

  • 當大多數[時間或資源]關鍵查詢意味着表上的其他過濾器,並且SQL可以通過檢查表中本身的值(或者在覆蓋索引中,特別是FK不是列出的第一列的值)來解析JOIN這些其他過濾器產生的可能結果的[小]子集。
  • 其中表格相對較小的情況(查找表等),因爲SQL通常決定掃描策略以及它們被緩存)。但隨後,它們體積小,一般相對靜態的,所以額外的索引的成本將不再是一個問題...
  • 可能會有一些更多的情況下...

任何其他棘手加速JOIN或其他這樣耗時的查找?

當涉及到移動數據時,例如添加大量數據時,等等。刪除索引(或其中的一些),執行CUD(插入/更新/ DELETE)操作,然後重新創建索引。當然,如果在更新期間同時搜索數據庫,這並不總是可能的。

至少同時還要注意與索引相關的FILL_FACTOR,因爲這些明智的選擇(從多一點空間,在消費的成本,最高)保持指數fragmentatation到最低指標的定期維護之間

0

我不是專家,但我可以提供您的問題清單上的一些共同看法:

  • FK-指數增添了幾分空間/時間,但它仍然是值得的
  • 是,值得它
  • FK帶有索引
  • FK適合連接;其他查找是完全不同的故事。

對於大多數的查找,這是值得沒有優化的前期,但等到觀察的性能問題,則:

  1. 精確測量
  2. 再次做出改變
  3. 措施,比較
  4. 如果沒有獲得或者不值得的麻煩,請丟棄更改

還要注意的是指標不一定只包括一列,但幾列。 這需要更多的推理,關於要使用哪些列以及以何種順序。這些問題將成爲績效所必不可少的。

2

如果您想利用參照完整性約束,則必須使用外鍵。

1

如果您規範化了數據,那麼您應該使用外鍵約束;這是確保您的數據無效的唯一實用方法。

你是否應該創建外鍵索引是稍微複雜一些。在所有RDBMS中,外鍵的索引創建不是自動的。像任何其他索引一樣,它會交換空間和插入時間以獲得更快的讀取速度(可能尤其明顯,因爲JOIN操作往往是數據庫中較慢的操作)。您還需要考慮FK列是否會被其他索引覆蓋,並且可能不需要它自己的索引。