03 索引 聚集索引 1

2022-02-09 05:44:07 字數 3348 閱讀 3166

建立聚集索引並重新組織

create

unique

clustered

index

cix_employee001_id

onemployee001(id

);alter

index

cix_employee001_id

onemployee001

reorganize

;索引情況

select

database_id

,index_id

,index_type_desc

,index_depth

,index_level

,page_count

from

sys.

dm_db_index_physical_stats

(db_id

('indexdb'

),object_id

('employee001'

),null,null,null)

只有乙個聚集索引,索引深度為3(兩級聚集索引頁+一級資料頁),資料頁數量為1615

重新查詢頁資訊

truncate

table

dbccindresult

insert

into

dbccindresult

exec

('dbcc ind(indexdb,employee001,-1)'

)與02.索引-堆表中相比 多了一些pagetype=2的頁(索引頁)

並且 資料頁的數量變少了(1615個,不一定變少,只是可能存資料頁數量不一樣的情況)

同事頁編號也改變了(由於需要生成聚集索引,資料頁也會被重新組織,按照索引鍵列排序)

根據查詢出的索引非葉子節點的資訊,索引頁有兩種indexlevel

indexlevel=2 是根節點 indexlevel是中間節點

indexlevel=0肯定是資料頁節點

從根節點的索引頁開始看

dbcc

traceon

(3604

)dbcc

page

(indexdb,1

,2162,3

);共有16行資料,指向16個中間索引頁(pagetype=2,indexlevel=1),

選擇乙個中間索引頁檢視

由於是最後一層索引頁(由於資料量只有10w,因此只建立了2 level的索引),因此資料行指向 資料頁

選擇乙個資料頁檢視

dbcc

traceon

(3604

)dbcc

page

(indexdb,1

,2260,3

)with

tableresults

;將資料插入到表中,方便查詢

--檢視分頁情況

select

*from

dbccindresult

--檢視頁的詳細資料

dbcc

traceon

(3604

)truncate

table

dbccpageresult

--選中一頁 例如 145頁

insert

into

dbccpageresult

exec

('dbcc page (indexdb, 1, 2260, 3) with tableresults'

)select

*from

dbccpageresult

where

field

in('id'

)可以看到id列(聚集索引列)是按照排序排好的

查詢資料,開啟io和執行計畫

setstatistics

ioon

select

name

from

employee001

whereid=

'43107053d74e484eb02b5b395178f682'

與02.索引-堆表中(沒有任何索引)相同的查詢對比

執行計畫為 clustered index seek

只有三次邏輯讀取(根據樹的查詢方式可以推斷,三次讀取分別為根索引頁,乙個indexlevel=1的索引頁,乙個資料頁)

可以進一步證明,使用下面的語句檢視查詢過程中使用了哪些資源:

use[indexdb]

goset

transaction

isolation

level

repeatable

read

gobegin

tran

setstatistics

ioon

select

name

from

employee001

whereid=

'43107053d74e484eb02b5b395178f682'

setstatistics

iooff

use[indexdb]

--要查詢申請鎖的資料庫

goselect

[request_session_id],c

.[program_name]

,db_name(c

.[dbid])as

dbname

,[resource_type]

,[request_status]

,[request_mode]

,[resource_description]

,object_name(p

.[object_id])as

objectname,p

.[index_id]

from

sys.

[dm_tran_locks]asa

left

join

sys.

[partitions]asp

ona.[resource_associated_entity_id]=p

.[hobt_id]

left

join

sys.

[sysprocesses]asc

ona.[request_session_id]=c

.[spid]

wherec.

[dbid]

=db_id

('indexdb'

)anda.

[request_session_id]

=@@spid

order

by[request_session_id]

,[resource_type]

commit

tran

05 索引 非聚集索引 1 聚集表

建立非聚集索引 create nonclustered index ncix employee001 department organization onemployee001 department organization alter index ncix employee001 departme...

聚集索引 非聚集索引

通常情況下,建立索引是加快查詢速度的有效手段。但索引不是萬能的,靠索引並不能實現對所有資料的快速訪問。事實上,如果索引策略和資料檢索需求嚴重不符的話,建立索引反而會降低查詢效能。因此在實際使用當中,應該充分考慮到索引的開銷,包括磁碟空間的開銷及處理開銷 如資源競爭和加鎖 例如,如果資料頻繁的更新或刪...

聚集索引,非聚集索引,覆蓋索引 原理

資料庫 和 資料庫索引 這兩個東西是在伺服器端開發領域應用最為廣泛的兩個概念,熟練使用資料庫和資料庫索引是開發人員在行業內生存的必備技能 使用索引很簡單,只要能寫建立表的語句,就肯定能寫建立索引的語句,要知道這個世界上是不存在不會建立表的伺服器端程式設計師的。然而,會使用索引是一回事,而深入理解索引...