溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

三、索引優(yōu)化(3)聚集索引上的非聚集索引

發(fā)布時(shí)間:2020-07-23 18:06:11 來源:網(wǎng)絡(luò) 閱讀:956 作者:jimshu 欄目:web開發(fā)

一、索引結(jié)構(gòu)

  在聚集索引上建立非聚集索引,在日常應(yīng)用中經(jīng)常發(fā)生。

  非聚集索引具有獨(dú)立于數(shù)據(jù)行的結(jié)構(gòu)。非聚集索引包含非聚集索引鍵值,并且每個(gè)鍵值項(xiàng)都有指向包含該鍵值的數(shù)據(jù)行的指針。

  從非聚集索引中的索引行指向數(shù)據(jù)行的指針稱為行定位器。行定位器的結(jié)構(gòu)取決于數(shù)據(jù)頁是存儲(chǔ)在堆中還是聚集表中,對(duì)于聚集表,行定位器是聚集索引鍵。

 

三、索引優(yōu)化(3)聚集索引上的非聚集索引

 

二、實(shí)驗(yàn)[三E]

  繼續(xù)使用上一篇文章中創(chuàng)建的唯一聚集索引,在此基礎(chǔ)之上新建一個(gè)非聚集索引。

1. 創(chuàng)建非聚集索引

CREATE INDEX  IX_person1_UserIDModifyDate  
    ON person1 (UserID,ModifyDate)

 

 

2. 查看索引占用的空間

DBCC SHOWCONTIG ('person1') WITH ALL_INDEXES

   結(jié)果如下:

DBCC SHOWCONTIG 正在掃描 'person1' 表...
表: 'person1' (389576426);索引 ID: 1,數(shù)據(jù)庫 ID: 8
已執(zhí)行 TABLE 級(jí)別的掃描。
- 掃描頁數(shù)................................: 4000
- 掃描區(qū)數(shù)..............................: 500
- 區(qū)切換次數(shù)..............................: 499
- 每個(gè)區(qū)的平均頁數(shù)........................: 8.0
- 掃描密度 [最佳計(jì)數(shù):實(shí)際計(jì)數(shù)].......: 100.00% [500:500]
- 邏輯掃描碎片 ..................: 0.03%
- 區(qū)掃描碎片 ..................: 2.20%
- 每頁的平均可用字節(jié)數(shù).....................: 76.0
- 平均頁密度(滿).....................: 99.06%
DBCC SHOWCONTIG 正在掃描 'person1' 表...
已執(zhí)行 LEAF 級(jí)別的掃描。
- 掃描頁數(shù)................................: 179
- 掃描區(qū)數(shù)..............................: 23
- 區(qū)切換次數(shù)..............................: 22
- 每個(gè)區(qū)的平均頁數(shù)........................: 7.8
- 掃描密度 [最佳計(jì)數(shù):實(shí)際計(jì)數(shù)].......: 100.00% [23:23]
- 邏輯掃描碎片 ..................: 0.00%
- 區(qū)掃描碎片 ..................: 4.35%
- 每頁的平均可用字節(jié)數(shù).....................: 51.3
- 平均頁密度(滿).....................: 99.37%
DBCC 執(zhí)行完畢。如果 DBCC 輸出了錯(cuò)誤信息,請(qǐng)與系統(tǒng)管理員聯(lián)系。

 

3. 查看索引的層次

  對(duì)于建立在聚集索引上的非聚集索引,

SELECT index_depth, index_level, record_count, page_count,
min_record_size_in_bytes as 'MinLen',
max_record_size_in_bytes as 'MaxLen',
avg_record_size_in_bytes as 'AvgLen',
convert(decimal(6,2),avg_page_space_used_in_percent) as 'PageDensity'
FROM sys.dm_db_index_physical_stats
  (8, OBJECT_ID('person1'),2,NULL,'DETAILED')

  結(jié)果如下表所示: 

index

_depth

Index

_level 

Record

_count 

Page

_count

MinLen

MaxLen 

AvgLen 

PageDensity

2

0

80000 

179

16

16

16

99.36

2

1

179

1

22

22

22

53.05

   根據(jù)上表的數(shù)據(jù),可以發(fā)現(xiàn)它與堆上的非聚集索引的數(shù)據(jù)是一樣的。該索引共有2層。level=0 是葉級(jí),它有179個(gè)頁面,指向底層的聚集索引的根頁;level=1 是這個(gè)非聚集索引的根頁,它只有1個(gè)頁面,指向葉級(jí)的179個(gè)索引頁。

 

 

三、比較三類索引占用的頁數(shù)

  比較前面幾個(gè)實(shí)驗(yàn),各類索引占用的頁數(shù)如下:

1. 堆

  在實(shí)驗(yàn)[三A]中,堆是最原始的結(jié)構(gòu),index_id = 0,存儲(chǔ)了 80000 條記錄,占用了4000 頁。

 

2. 聚集索引

  聚集索引的 index_id = 1。

  唯一聚集索引在葉級(jí)將數(shù)據(jù)頁重新進(jìn)行物理排序,不會(huì)額外增加數(shù)據(jù)頁。由于索引寬度固定,因此在根級(jí)只占用了1個(gè)頁,中間級(jí)占用了7個(gè)頁。一共占用了1+7+4000=4008 頁。與堆相比,非葉級(jí)的索引頁多了8頁。

  非唯一聚集索引需要在后臺(tái)保持?jǐn)?shù)據(jù)的唯一,因此在后臺(tái)增加了一個(gè) 4 字節(jié)的uniqueifier 列,有可能需要增加額外的數(shù)據(jù)頁。在前面的案例中,非唯一聚集索引使用了4009頁,也就是多了9個(gè)頁。同時(shí)由于索引寬度的開銷較大,中間級(jí)占用了10個(gè)頁,加上根級(jí)占用了1個(gè)頁,一共占用了1+10+4009=4020 頁。與堆相比,葉級(jí)索引頁(數(shù)據(jù)頁)多了9頁,非葉級(jí)的索引頁多了11頁。

 

3. 非聚集索引

  堆上的非聚集索引與聚集索引上的非聚集索引,index_id >= 2,占用了相同數(shù)量的索引頁面,頁面數(shù)量為:179+1=180 頁。

 

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI