建立聚集索引並重新組織
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...
聚集索引 非聚集索引
通常情況下,建立索引是加快查詢速度的有效手段。但索引不是萬能的,靠索引並不能實現對所有資料的快速訪問。事實上,如果索引策略和資料檢索需求嚴重不符的話,建立索引反而會降低查詢效能。因此在實際使用當中,應該充分考慮到索引的開銷,包括磁碟空間的開銷及處理開銷 如資源競爭和加鎖 例如,如果資料頻繁的更新或刪...
聚集索引,非聚集索引,覆蓋索引 原理
資料庫 和 資料庫索引 這兩個東西是在伺服器端開發領域應用最為廣泛的兩個概念,熟練使用資料庫和資料庫索引是開發人員在行業內生存的必備技能 使用索引很簡單,只要能寫建立表的語句,就肯定能寫建立索引的語句,要知道這個世界上是不存在不會建立表的伺服器端程式設計師的。然而,會使用索引是一回事,而深入理解索引...