2012-10-16 61 views
10

可能重複:
Why can’t I simply add an index that includes all columns?索引的所有列

知道了索引列導致更好的性能,是值得指標均列的數據庫的所有表中?這種方法的優點和缺點是什麼?

如果值得,有沒有辦法在SQL Server中自動創建索引?我的應用程序動態添加表和列(取決於用戶配置),我想讓它們自動索引。

+0

首先,如果您的查詢使用的不是一個而是兩個或更多的列,那麼如果您有兩個/多個列索引,則會更好。 第二 - 索引使用磁盤空間,所以它不是免費的:) –

+3

也索引使您的更新操作更慢 –

+9

Ocaso:不重複。您引用的問題詢問是否創建包含表中所有列的1個索引是一個好主意。這個問題是詢問是否爲每個N列在表上創建N個索引是一個好主意。 –

回答

11

由於上面提到的原因,很難想象現實世界中每個列的索引都是有用的。場景的類型需要大量不同的查詢,全部訪問表格的一列。每個查詢都可以訪問不同的列。

其他答案沒有解決期間選擇期間的問題。很顯然,維護索引是一個問題,但是如果您創建表/ s一次,然後閱讀很多次,則更新/插入/刪除的開銷不是一個考慮因素。

索引包含原始數據以及指向數據所在記錄/頁面的點。索引的結構使得它能夠快速執行如下操作:查找單個值,按順序檢索值,計算不同值的數量,並查找最小值和最大值。

索引不僅佔用磁盤空間。更重要的是,它佔據了記憶。而且,內存爭用通常是決定查詢性能的因素。一般來說,在每一列上建立一個索引將佔用比原始數據更多的空間。 (一個例外將是相對寬並且具有相對較少值的列)。

另外,爲了滿足許多查詢,您可能需要一個或多個索引加上的原始數據。您的頁面緩存會充滿數據,這可能會增加緩存未命中的數量,從而導致更多的開銷。

我不知道你的問題是否真的表明你沒有充分模擬你的數據結構。很少有情況下,您希望用戶構建臨時永久表。更典型的是,他們的數據將以預定義的格式存儲,您可以根據訪問需求進行優化。

+0

我會說我的概念和'master'數據庫一樣,它包含的表格可以保存服務器上的數據庫和表的結構。那些包含你需要的數據。 –

+0

我的數據庫有標準表格,可以保存用戶所做的配置。根據他的要求,可以創建新的表格。我無法在設計時間猜出他的疑問 –

+1

實際上,我相信大多數現代數據庫都將索引頁面與數據頁面分開存儲,而不是連續的。雖然它增加了佔用磁盤的總大小,但如果DBMS使用該索引,則只會影響內存,頁面加載和高速緩存百分比,也就是將其讀入內存。一個座標不被使用的索引不影響選擇性能。 –

2

不,在維護索引時會有開銷,因此索引所有列會減慢所有插入,更新和刪除操作。您應該爲您在WHERE子句中經常引用的列建立索引,並且您將看到一個好處。

2

索引佔用空間。而且他們需要時間來創建,重建,維護等。因此,索引任何舊列的性能不會有保證的回報。您應該爲給您使用的操作提供性能的列索引。索引有助於讀取,所以如果您主要閱讀,索引列將按照關係搜索,排序或聯合到其他表。否則,它比您可能看到的好處更昂貴。

7

不,因爲您必須考慮到每次添加或更新記錄時都必須重新計算索引,並且在所有列上都有索引會花費大量時間並導致性能不佳。

所以像數據倉庫那樣只有選擇查詢的數據庫是一個好主意,但在普通數據庫中這是一個壞主意。

另外,這不是因爲您在where子句中使用了一列,所以您必須在其上添加索引。 嘗試查找記錄將幾乎全部像主鍵一樣唯一且不經常編輯的列。 一個壞主意是索引一個人的性別,因爲只有兩個可能的值,索引的結果只會分割數據,然後它會搜索幾乎每一條記錄。

+6

+1參考價值分佈(又名人的性別) –

+0

至少在Oracle中,這就是爲什麼[位圖](http://www.oracle.com/technetwork/articles/sharma-indexes-093638.html)存在索引 –

+0

非常清楚的解釋,謝謝! – ArchNoob

2

不,你不應該索引所有的字段,並且有幾個方面的原因:

  • 有插入,更新過程中保持各指標或delete語句成本,這將導致各這些交易需要更長的時間。
  • 由於每個索引佔用磁盤空間,它將增加所需的存儲空間。
  • 如果列值不分散,索引將不會被使用/忽略(例如:性別標誌)。
  • 對於經常運行的WHERE,GROUP BY,ORDER BY或JOIN子句,組合索引(具有多個列的索引)可以大大提高性能,並且不能組合多個單一索引。

在使用Explain計劃和數據訪問並在必要時添加索引(只在必要時,恕我直言),而不是事先創建它們,你會好得多。