建立非聚集索引
create
nonclustered
index
ncix_employee001_department_organization
onemployee001
(department
,organization
);alter
index
ncix_employee001_department_organization
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)
變成了兩個索引
其中 聚集索引頁數量為 1615,其實就是資料頁的數量
非聚集索引的數量為 1244
重新查詢dbcc ind
truncate
table
dbccindresult
insert
into
dbccindresult
exec
('dbcc ind(indexdb,employee001,-1)'
)分析結果
select
*from
dbccindresult
where
pagetype=2
andindexid=1
之前建立的聚集索引頁沒有任何變化 依舊是 1+16=17個
select
*from
dbccindresult
where
pagetype=2
andindexid=3
同時,增加了一些indexid=3的頁,就是剛剛建立的非聚集索引頁
非聚集索引的indexlevel =2 的數量為 1 indexlevel=1 的數量為 18 indexlevel=0 的頁數量為 1244
1+18+1244=1263
注意 跟聚集索引不同的是 聚集索引 indexlevel=0的是資料頁 而非聚集索引卻是索引頁
從根節點開始看
找到根select
*from
dbccindresult
where
pagetype=2
andindexid=3
andindexlevel=2
--結果 250
檢視dbcc
traceon
(3604
)dbcc
page
(indexdb,1
,250,3
);indexlevel =1 的頁有18個
接著檢視 indexlevel =1 的索引頁
接著檢視indexlevel=0的頁(索引頁!!!)
注意到 每個非聚集索引頁中都有乙個id (key)列
在非聚集索引的葉子層,每個索引行包含非聚集索引鍵值(keyhashvalue)和行定位器。這個定位器指向聚集索引或堆表的資料行。
根據這個定位器可以定位到一行資料。
如果聚集表,存在聚集索引,則聚集索引,即圖中的id(key) 作為定位器。
如果是堆表,它沒有聚集索引,行定位器是個指向行的指標。這個指標由頁裡行的(檔案號:頁號:槽號,file identifier :page number :slot number)組成
行定位器主要用於查詢不在非聚集索引鍵列定義中的列時,需要定位到行中將資料讀取出來。
這時候會先定位到需要的非聚集索引,然後根據行定位器找到資料(rid lookup or key lookup)
後續會再介紹。
接下來 看非聚集索引的查詢過程:
setstatistics
ioon
select
department
from
employee001
where
department
='dep7'
可以看到使用了索引(非聚集索引)查詢
聚集索引 非聚集索引
通常情況下,建立索引是加快查詢速度的有效手段。但索引不是萬能的,靠索引並不能實現對所有資料的快速訪問。事實上,如果索引策略和資料檢索需求嚴重不符的話,建立索引反而會降低查詢效能。因此在實際使用當中,應該充分考慮到索引的開銷,包括磁碟空間的開銷及處理開銷 如資源競爭和加鎖 例如,如果資料頻繁的更新或刪...
聚集索引和非聚集索引
聚集索引和非聚集索引 一 聚集索引和非聚集索引 聚集索引和非聚集索引的根本區別是表記錄的排列順序和與索引的排列順序是否一致,聚集索引表記錄的排列順序與索引的排列順序一致,優點是查詢速度快,因為一旦具有第乙個索引值的紀錄被找到,具有連續索引值的記錄也一定物理的緊跟其後。聚集索引的缺點是對錶進行修改速度...
聚集索引和非聚集索引
本文引自 一種索引,該索引中鍵值的邏輯順序決定了表中相應行的物理順序。聚集索引確定表中資料的物理順序。聚集索引類似於 簿,後者按姓氏排列資料。由於聚集索引規定資料在表中的物理儲存順序,因此乙個表只能包含乙個聚集索引。但該索引可以包含多個列 組合索引 就像 簿按姓氏和名字進行組織一樣。聚集索引對於那些...