索引深入淺出 7 10 非唯一列上的非聚集索引

2021-09-06 23:13:49 字數 2593 閱讀 9511

在索引深入淺出:非聚集索引的b樹結構在聚集表裡,我們討論了非聚集索引。我們提到,唯一非聚集索引可以讓所討論的問題變得簡單很多。我們已經知道了非聚集索引的通用結構,現在我們來看下在非唯一列上的非聚集索引的儲存結構。

我們來看乙個例子。

1

select

*into dbo.salesorderdetail from

adventureworks2008r2.sales.salesorderdetail2go

3create

unique

clustered

index ix_salesorderdetail on

dbo.salesorderdetail(salesorderdetailid)4go

5create

index ix_productid on salesorderdetail(productid,salesorderid)

我們用dbcc ind看下非聚集索引的頁面分配情況,並找出根頁。

1

truncate

table

dbo.sp_table_pages

2insert

into sp_table_pages exec('

dbcc ind(indexdb,salesorderdetail,2)')

3go45

select

*from dbo.sp_table_pages order

by indexlevel desc

--根節點/索引頁

可以看出,5128頁是我們的根頁。我們用dbcc page看下5128頁資訊還有葉子頁的資訊。

1

dbcc traceon(3604)2

dbcc page(indexdb,1,5128,3)--根頁3

4dbcc traceon(3604)5

dbcc page(indexdb,1,3760,3)--

葉子頁

我們來看上半部分的根頁,聚集鍵(salesorderdetailid)被加到了根頁。如果你和索引深入淺出:非聚集索引的b樹結構在聚集表裡的根頁比較,會發現那裡的根頁裡沒有聚集鍵,只有在葉子頁裡才可以找到聚集鍵。在你把非聚集索引定義為唯一或非唯一(unique or non unique)時,葉子層的頁結構不會發生改變。

我們看下堆表的情況。

1

select

*into dbo.salesorderdetailheap from

adventureworks2008r2.sales.salesorderdetail2go

3create

index ix_productid on

salesorderdetailheap (productid,salesorderid)4go

5select index_id from sys.indexes where name=

'ix_productid

'and

6object_name(object_id)=

'salesorderdetailheap'7

go8dbcc ind('

indexdb

','salesorderdetailheap

',2)9go

10truncate

table

dbo.sp_table_pages

11insert

into sp_table_pages exec('

dbcc ind(indexdb,salesorderdetailheap,2)')

12select

*from dbo.sp_table_pages order

by indexlevel desc

--根節點/索引頁

13dbcc traceon(3604)14

dbcc page(indexdb,1,1192,3)--

根頁15

16dbcc traceon(3604)17

dbcc page(indexdb,1,1096,3)--

葉子頁

在根頁我們看到多了heap rid列,如果你回去看看索引深入淺出:非聚集索引的b樹結構在堆表,你會發現heap rid列只在葉子層裡的頁出現,不在根頁出現。在你把非聚集索引定義為唯一或非唯一(unique or non unique)時,葉子層的頁結構不會發生改變。

你可能已經注意到,在我們上述的例子裡,即使非聚集索引鍵是唯一的,sql server還是只當它是非聚集索引,因為當我們建立非聚集索引時沒加unique關鍵字。在索引所有層增加聚集鍵(或heap rid)可能會增加更多的索引層io操作,這個看聚集鍵的大小而定。因此在所有情況下,我們定義非聚集索引時,考慮選擇唯一列(或多列)作為非聚集鍵非常重要。

索引深入淺出 7 10 非唯一列上的非聚集索引

在索引深入淺出 非聚集索引的b樹結構在聚集表裡,我們討論了非聚集索引。我們提到,唯一非聚集索引可以讓所討論的問題變得簡單很多。我們已經知道了非聚集索引的通用結構,現在我們來看下在非唯一列上的非聚集索引的儲存結構。我們來看乙個例子。1 select into dbo.salesorderdetail ...

深入淺出MySQL索引(一)

首先,筆者在這裡明確一點 處理資料都是在記憶體中進行的,考慮得都是記憶體中的時間複雜度。如果我們要操作的資料集非常大,大到記憶體已經沒法處理了怎麼辦?比如資料庫表裡面上千萬條記錄。在這種情況下,對資料的處理需要不斷從硬碟等儲存裝置中調入或者調出記憶體頁面。一旦涉及到外部儲存裝置,關於時間複雜度的計算...

深入淺出理解索引

一 深入淺出理解索引結構 實際上,您可以把索引理解為一種特殊的目錄。sql server提供了兩種索引 聚集索引 clustered index,也稱聚類索引 簇集索引 和非聚集索引 nonclustered index,也稱非聚類索引 非簇集索引 下面,我們舉例來說明一下聚集索引和非聚集索引的區別...