叢集索引設計指導方針
叢集索引將資料表中的資料列依其索引鍵值排序與儲存。因為資料列本身只能以一種順序排序,所以每個資料表只能有一個叢集索引。如需叢集索引架構的詳細資訊,請參閱<叢集索引結構>。
除了一 些例外之外,每個資料表都應該在資料行上定義叢集索引,以提供下列功能:
可用於經常使用的查詢。
提供高度的唯一性。
[!附註]
在建立 PRIMARY KEY 條件約束時,會在資料行上自動建立唯一索引。依預設,此索引已叢集化;不過,您可以在建立條件約束時指定非叢集索引。
可用於範圍查詢。
如果叢集索引不是以 UNIQUE 屬性建立,則Database Engine會自動將 4 位元組的 uniqueifier 資料行加入資料表。當有需要時,Database Engine會自動將 uniqueifier 值加入資料行,使每個索引鍵都是唯一的。這個資料行及其值是供內部使用的,使用者看不到也無法存取它。
查詢考量
在建立叢集索引之前,必須先瞭解資料的存取方式。執行下列情況的查詢請考慮使用叢集索引:
使用如 BETWEEN、>、>=、< 以及 <= 等運算子來傳回值的範圍。
在使用叢集索引找到第一個值的資料列後,就可保證具有後續索引值的資料列是實體相鄰的。例如,如果在某個範圍的銷售訂單編號之間擷取記錄,在 SalesOrderNumber 資料行上的叢集索引可以快速地找到包含起始銷售訂單編號的資料列,然後擷取資料表中所有連續資料列,直到達到最後一個銷售訂單編號。
傳回大型結果集。
使用 JOIN 子句;通常這些都是外部索引鍵資料行。
使用 ORDER BY 或 GROUP BY 子句。
在 ORDER BY 或 GROUP BY 子句中指定的資料行之索引,可讓Database Engine不需排序資料,因為資料列已經排序過了。這種方式可以提高查詢的執行效能。
資料行考量
一般而言,您應該盡可能以較少的資料行來定義叢集索引鍵。考慮具有下列一或多個屬性的資料行:
是唯一或包含許多不同的值
例如,員工識別碼可唯一識別員工。在 EmployeeID 資料行上的叢集索引或 PRIMARY KEY 條件約束,將改善查詢的效能,可根據員工識別碼來搜尋員工資訊。此外,也可以在 LastName、FirstName、MiddleName 上面建立叢集索引,因為員工記錄經常以此方式來群組和查詢,而這些資料行的組合仍可提供高度的差異性。
循序存取
例如,產品識別碼可唯一識別在 AdventureWorks 資料庫中的 Production.Product 資料表。在指定循序搜尋的查詢中,例如 WHERE ProductID BETWEEN 980 and 999,將可獲得 ProductID 上叢集索引的好處。這是因為資料列將根據該索引鍵資料行排序過。
定義為 IDENTITY,因為資料行在資料表中保證是唯一的。
經常使用以排序從資料表擷取的資料。
最好能夠根據該資料行來叢集化 (即實際上的排序) 資料表,以省下每次在查詢資料行時都需進行排序的成本。
對下列屬性來說,叢集索引並不是理想的選擇:
變更頻繁的資料行
這使得整個資料列移動 (因為Database Engine必須以實際的順序保存資料列中的資料值)。對於資料經常變動的龐大交易處理系統來說,這是一項很重要的考量。
寬索引鍵
寬索引鍵是由數個資料行或是數個大型資料行所組成。所有的非叢集索引都使用叢集索引的索引鍵值做為查閱索引鍵。任何在相同資料表上所定義的非叢集索引將會非常大,因為非叢集索引項目包含叢集索引鍵,同時也包含在該非叢集索引上所定義的索引鍵資料行。
索引選項
在建立叢集索引時,可以指定一些索引選項。因為叢集索引通常都相當大,您應該特別考慮下列選項:
SORT_IN_TEMPDB
DROP_EXISTING
FILLFACTOR
ONLINE
如需詳細資訊,請參閱<設定索引選項>。