bkjia.com獨家特稿】本文介紹了SQL Server和Oracle的索引及常見的索引類型,希望通過比較的方法,加深對二種資料庫索引應用的理解。
1 SQL Server中的索引
索引是與表或視圖關聯的磁碟上結構,可以加快從表或視圖中檢索行的速度。索引包含由表或視圖中的一列或多列產生的鍵。這些鍵儲存在一個結構B 樹)中,使 SQL Server 可以快速有效地尋找與索引值關聯的行。
表或視圖可以包含以下類型的索引:
叢集索引
叢集索引根據資料行的索引值在表或視圖中排序和儲存這些資料行。索引定義中包含叢集索引列。每個表只能有一個叢集索引,因為資料行本身只能按一個順序排序。
只有當表包含叢集索引時,表中的資料行才按排序次序儲存。如果表具有叢集索引,則該表稱為聚集表。如果表沒有叢集索引,則其資料行儲存在一個稱為堆的無序結構中。
每個表幾乎都對列定義叢集索引來實現下列功能:
1、可用於經常使用的查詢。
2、提供高度唯一性。
在建立叢集索引之前,應先瞭解資料是如何被訪問的。考慮對具有以下特點的查詢使用叢集索引:
使用運算子如 BETWEEN、>、>=、< 和 <=)返回一系列值。
使用叢集索引找到包含第一個值的行後,便可以確保包含後續索引值的行物理相鄰。例如,如果某個查詢在一系列採購訂單號間檢索記錄,PurchaseOrderNumber 列的叢集索引可快速定位包含起始採購訂單號的行,然後檢索表中所有連續的行,直到檢索到最後的採購訂單號。
返回大型結果集。
使用 JOIN 子句;一般情況下,使用該子句的是外鍵列。
使用 ORDER BY 或 GROUP BY 子句。
在 ORDER BY 或 GROUP BY 子句中指定的列的索引,可以使資料庫引擎 不必對資料進行排序,因為這些行已經排序。這樣可以提高查詢效能。
叢集索引不適用於具有下列屬性的列:
頻繁更改的列
這將導致整行移動,因為資料庫引擎 必須按物理順序保留行中的資料值。這一點要特別注意,因為在大容量交易處理系統中資料通常是可變的。
寬鍵
寬鍵是若干列或若干大型列的組合。所有非叢集索引將叢集索引中的索引值用作尋找鍵。為同一表定義的任何非叢集索引都將增大許多,這是因為非叢集索引項包含聚集鍵,同時也包含為此非叢集索引定義的鍵列。
非叢集索引
非叢集索引具有獨立於資料行的結構。非叢集索引包含非叢集索引索引值,並且每個索引值項都有指向包含該索引值的資料行的指標。
從非叢集索引中的索引行指向資料行的指標稱為行定位器。行定位器的結構取決於資料頁是儲存在堆中還是聚集表中。對於堆,行定位器是指向行的指標。對於聚集表,行定位器是叢集索引鍵。
在 SQL Server 2005 中,可以向非叢集索引的分葉層級添加非鍵列以跳過現有的索引鍵限制900 位元組和 16 鍵列),並執行完整範圍內的索引查詢。
非叢集索引與叢集索引具有相同的 B 樹結構,它們之間的顯著差別在於以下兩點:
1、基礎資料表的資料行不按非聚集鍵的順序排序和儲存。
2、非叢集索引的葉層是由索引頁而不是由資料頁組成。
設計非叢集索引時需要注意資料庫的特徵:
更新要求較低但包含大量資料的資料庫或表可以從許多非叢集索引中獲益從而改善查詢效能。
決策支援系統應用程式和主要包含唯讀資料的資料庫可以從許多非叢集索引中獲益。查詢最佳化工具具有更多可供選擇的索引用來確定最快的存取方法,並且資料庫的低更新特徵意味著索引維護不會降低效能。
聯機交易處理應用程式和包含大量更新表的資料庫應避免使用過多的索引。此外,索引應該是窄的,即列越少越好。
一個表如果建有大量索引會影響 INSERT、UPDATE 和 DELETE 語句的效能,因為所有索引都必須隨表中資料的更改進行相應的調整。
唯一索引
唯一索引確保索引鍵不包含重複的值,因此,表或視圖中的每一行在某種程度上是唯一的。
叢集索引和非叢集索引都可以是唯一索引。
包含性列索引
一種非叢集索引,它擴充後不僅包含鍵列,還包含非鍵列。