2016-12-31 43 views
2

是否有任何理由我不應該爲每個數據庫表創建一個索引,作爲提高性能的手段?似乎必須有一些原因,否則所有表格默認會自動擁有一個。數據庫表中的索引有什麼缺點?

我使用MS SQL Server 2016.

+0

簡單的答案是當你的表中有更多'INSERT/UPDATE/DELETE'而不是'SELECT'時,那麼在該表上創建'Index'可能不會有效 –

+0

其他缺點會增加存儲需求(對於索引本身) ,可能還有索引維護計劃。你計劃在2017年創建索引嗎? –

+0

請檢查以下鏈接 1. https://social.msdn.microsoft.com/Forums/sqlserver/en-US/bd9b36db-7b70-43b8-a971-f6c881cde269/disadvantages-of-clustered-and-nonclustered-索引?forum = sqlgetstarted 2. http://stackoverflow.com/questions/764210/what-are-the-disadvantages-of-having-many-indices –

回答

9

表上的一個索引不是什麼大問題。您自動擁有主鍵或聲明爲唯一的列(或列組合)的索引。

索引有一些開銷。索引本身佔用磁盤和內存空間(使用時)。所以,如果空間或內存問題,那麼索引太多可能會成爲問題。在插入/更新/刪除數據時,需要保持索引以及原始數據。這會降低更新速度並鎖定可能影響查詢處理的表(或表的一部分)。

每個表上的少量索引是合理的。這些應該在設計時考慮到典型的查詢負載。如果您在每個表格中對每一列進行索引,那麼數據修改會減慢。如果你的數據是靜態的,那麼這不是一個問題。然而,吃掉索引的所有記憶可能是一個問題。

+3

太多的索引還會增加編譯開銷並增加死鎖的可能性由於不同的數據訪問路徑。 –

+1

@TT。 。 。 。你是對的,我學到了一些東西:https://en.oxforddictionaries.com/explore/number-of-people-is-or-are。 –

+0

@GordonLinoff是的,我有點太急於糾正這一點,但我有一個刺痛的疑問。看着它,這是正確的,因爲你最初寫道:)。 HNY! –

0

至少我通常會建議每個表至少有一個索引,這將自動創建在您的表主鍵上,例如IDENTITY列。那麼外鍵通常會從索引中受益,這需要手動創建。其他經常包含在WHERE子句中的列應該被編入索引,特別是如果它們包含大量唯一值。索引列的好處,例如性別(低基數),只有2個值是值得商榷的。 我的數據庫中的大多數表都有1到4個索引,具體取決於表中的數據以及如何檢索這些數據。

相關問題