Clustered VS NonClustered Indexes

叢集索引:

Table資料本身就是叢集索引的一部分(含所有欄位)

即Table本身就是叢集索引的分葉節點(leaf level)

而Table資料存放順序依照所選定的欄位來排序(大到小或小到大)

通常一個Table只能存在一個叢集索引,因為資料存放順序只能遵守一種準則(大到小或小到大)

這也代表決定叢集索引欄位是很重要的事情。

上面提到建立叢集索引後,資料即享有排序同時Table資料本身就是叢集索引的一部分

所以挑選叢集索引欄位應該符合常使用來排序的欄位(order by、group by)

或唯一,也就是該欄位資料你不會輕易更改都適合建立叢集索引

以及不可NULL等特性(但不總是)。

select * from sales where SalesOrderDetailID>1 and SalesOrderDetailID<10000

因為要顯示所有欄位,所以SalesOrderDetailID適合建立叢集索引。

叢集索引結構

非叢集索引:

非叢集索引與叢集索引有下列差異:

1.Table的資料列並未依據非叢集索引鍵的順序,進行排序與儲存。

2.非叢集索引的分葉層是由索引頁 (而不是資料頁) 所組成。

3.如果Table有建立叢集索引則非叢集索引也包含叢集索引的鍵值。

非叢集索引資料列中的資料列定位器是資料列的指標,或資料列的叢集索引鍵,如下所述:

1.如果資料表為Heap (沒有叢集索引),則分葉節點存放的是指向Table鍵值與欄位鍵值的Row Id(資料列的指標)。

2.如果資料表有叢集索引,則資料列定位器為資料列的叢集索引鍵,

SQL Server 藉由使用非叢集索引之分葉資料列所儲存的叢集索引鍵來搜尋叢集索引,以便擷取資料列。

第一種狀況:查詢條件選擇性不高。

1 –create Nonclustered Indexes

2

3 create index idx_1 on dbo.sale(SalesOrderDetailID)

4

5 go

select * from dbo.sale t where t.SalesOrderDetailID >600 and t.SalesOrderDetailID<700