一般而言,下列的資料存取作業非常適合使用叢集索引:
1.
如果某欄位所內含之相異資料的數目有限,則非常適合替此欄位建立叢集索引。
2.
使用BETWEEN、>、>=、<、<=等運算子來傳回介於特定範圍之資料記錄的查詢。
3.
欄位會依特定次序被存取。
4.
會傳回大量資料的查詢。
5.
經常使用於查詢之連結條件、ORDER BY或GROUP BY引數的欄位,通常這些欄位是外部索引鍵。
6.
使用叢集索引來搜尋獨一鍵值欄的速度也非常快,因此可將PRIMARY KEY條件約束的獨一索引設定成叢集索引。
※於建立叢集索引時,還必須注意下列事項:
1.
每一個資料表最多只能擁有一個叢集索引。
由於叢集索引會改變資料表之資料記錄實際的存放次序,因此每一個資料表最多只能擁有一個叢集索引。(如果要建立任何非叢集索引前,先建立叢集索引)
2.
叢集索引可以是一個獨一索引或非獨一索引。
3.
叢集索引的大小平均是資料表大小的5%。(會隨著鍵值欄的大小而有所變動)
4.
叢集索引之鍵值欄的數目越少越好。
5.
涵蓋式查詢不適合使用叢集索引。
※非叢集索引(NonClustered Index)
與叢集索引不同的是,非叢集索引不影響資料表中之資料記錄排列的順序,且可以擁有多個非叢集索引。
適合使用非叢集索引的情形有:
1.
如果某欄位所內含之相異資料的數目非常多時。
2.
所傳回之資料量不大的查詢。
3.
如果某欄位經常使用於查詢的搜尋條件(即WHERE引數)並要求其內容要符合特定的資料值時。
4.
涵蓋式查詢。
於建立非叢集索引時,還必須注意下列事項:
1.
每一個資料表最多能夠擁有249個非叢集索引。
2.
由於建立叢集索引會使得資料表所有現存的非叢集索引被重建,因此在建立任何非叢集索引前,先建立叢集索引。
3.
非叢集索引可以是一個獨一索引或非獨一索引。
※獨一索引VS非獨一索引
如果以資料的獨一性來區別,則有獨一索引(Unique Index)與非獨一索引(NonUnique Index)的不同。
假如希望所有資料記錄之某單一欄位或多個欄位組合後的結果是不能重複的,則可以替此欄位或多個欄位的組合建立一個獨一索引。值得注意的是,替資料表建立PRIMARY KEY或UNIQUE條件約束時,SQL Server就會自動建立獨一索引。
※是否忽略重複的鍵值
在批次新增的多筆資料記錄中,可能有某幾筆資料記錄的鍵值是重複的,此時如果獨一索引係設定’不要’忽略重複的鍵值,則所有的資料記錄都將遭拒而無法被新增至資料表,反之,此時如果獨一索引係設定’要’忽略重複的鍵值,則只有那些鍵值重複的資料記錄不會被新增至資料表,而那些鍵值沒有重複的資料記錄仍舊會順利被新增至資料表。
※單一鍵值索引VS多重鍵值索引
所謂單一鍵值索引,意指替某單一欄位建立索引;而多重鍵值索引,則是指替多個欄位的組合建立索引。
一般而言,於下列狀況中,會建立多重鍵值索引:
1.
當兩個或兩個以上的欄位組合在一起為最佳之搜尋鍵值時。
例如,以國家、城市與姓名三個資料組合進行搜尋。
2.
多重鍵值索引的各個欄位必須來自同一個資料表。
3.
定義多重鍵值索引時,辨識度高的欄位或是能傳回較低百分比之資料記錄的欄位應擺在前面。
例如,組合欄位(column1,column2)與(column2,column1)之不同索引速度。
4.
查詢的WHERE引數務必參考多重鍵值索引的第一個欄位,才能讓查詢最佳化器(Query Optimizer)去使用此多重鍵值索引。
5.
能提昇查詢速度又能減少資料表之索引數目,是使用多重鍵值索引的最高境界。
※填充係數(Fill Factor)
針對擁有叢集索引或非叢集索引之資料表執行INSERT或UPDATE命令時,可以藉由設定填充係數來最佳化其執行效率。
沒有留言:
張貼留言