Sql-Server

聚集索引與非聚集索引?

  • July 7, 2009

我負責一個較小的 DB 300+ 百兆 100’ish 表,大約有 45 個使用者在整個工作日內點擊它。主要是讀取,但有相當數量的更新和插入。我一直在放慢學習數據庫結構的速度,以便從中獲得一些性能。我聽說查看索引是一個很好的起點。所述數據庫的表的所有大多數索引都是集群的,其中一些是非集群的。

集群與非集群相比有速度優勢嗎?我有一個維護計劃(是的,我知道),在差異備份之前每晚重新組織和重建索引,現在這是否足夠好,直到我更好地掌握索引的形成和利用?

是否有(一個或多個)腳本可以幫助我查看各種索引的“性能”?我把自己弄進了多大的蠕蟲罐頭?

聚集索引確定表中數據的物理順序,並且對於經常搜尋值範圍的列特別有效。當索引值唯一時,它們對於查找特定行也很有效。

通常(有例外),聚集索引應該位於單調增加的列上 - 例如標識列,或值增加的其他列 - 並且是唯一的。在許多情況下,主鍵是聚集索引的理想列(但不要將聚集索引放在唯一標識符/GUID 列上。)

從這篇MSDN 文章

在創建聚集索引之前,了解您的數據將如何被訪問。考慮將聚集索引用於:

  • 包含大量不同值的列。
  • 使用 BETWEEN、>、>=、< 和 <= 等運算符返回一系列值的查詢。
  • 按順序訪問的列。
  • 返回大型結果集的查詢。
  • 經常被涉及 join 或 GROUP BY 子句的查詢訪問的列;通常這些是外鍵列。在 ORDER BY 或 GROUP BY 子句中指定的列上的索引消除了 SQL Server 對數據進行排序的需要,因為這些行已經排序。這提高了查詢性能。
  • 需要非常快速的單行查找的 OLTP 類型應用程序,通常通過主鍵進行。在主鍵上創建聚集索引。

聚集索引不是一個好的選擇:

  • 頻繁更改的列:這會導致整行移動(因為 SQL Server 必須保持行的數據值按物理順序排列)。在數據往往不穩定的大容量事務處理系統中,這是一個重要的考慮因素。
  • 寬鍵:來自聚集索引的鍵值被所有非聚集索引用作查找鍵,因此儲存在每個非聚集索引葉條目中。

SQLServerpedia.com 有一些很好的索引調整文章/教程:索引相關的 DMV 查詢使用正確的索引以獲得最佳性能

引用自:https://serverfault.com/questions/37251