Index
為同一列設置聚集索引和非聚集索引是否有意義
為同一列設置聚集索引和非聚集索引是否有意義
我繼承了一個數據庫和一個與之配套的網路服務。
查看重複的索引,我看到兩個索引指向同一列(1 列並以相同的方式排序)。一個是集群的,一個不是,這是我看到的唯一區別。
- 保留這兩者有意義嗎?
- 如果我刪除一個我應該刪除哪個
在解決這兩個問題之前,讓我簡要定義聚集索引和非聚集索引之間的區別。
聚集索引由鍵列組織。它還包括所有其他列作為行結構的一部分(即,它具有整行)。
非聚集索引也由鍵列組織。它隱含地包括集群鍵列(如果表是集群的)或指向行的指針(如果表是堆)。如果
INCLUDE
明確指定了任何列,它們也將包含在索引結構中。保留這兩者有意義嗎?
有一個極端情況,讓非聚集索引“複製”聚集索引是有意義的。如果您有一個經常掃描表的查詢,並且只使用聚集鍵列,則查詢優化器將更喜歡使用非聚集索引。非聚集索引不包含完整的行數據,因此它會佔用更少的物理空間。因為它佔用的物理空間更少,SQL Server 可以用更少的 IO 掃描表,並且出於性能原因會使用它。
可以查詢
sys.dm_db_index_usage_stats
,可以看到兩個索引的個數user_seeks
和上。user_scans
這將幫助您了解這兩個索引的使用情況,並確定這兩個索引的有用性。如果我刪除一個,我應該刪除哪個?
作為一般規則,大多數表都應該有一個聚集索引。(這是另一個話題)。不知道有關您的索引使用或數據訪問的任何詳細資訊,我猜如果您要刪除一個,您將刪除非聚集索引(但是,這確實是基於我所知道的猜測)。
根據聚集鍵、數據、數據訪問模式等,最正確的答案可能是刪除聚集索引並創建不同的聚集索引。您可能想閱讀更多關於有效聚集索引的資訊。