亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

索引深入淺出(4/10):非聚集索引的B樹結構在聚集表

2024-07-21 02:47:08
字體:
來源:轉載
供稿:網友
索引深入淺出(4/10):非聚集索引的B樹結構在聚集表

一個表只能有一個聚集索引,數據行以此聚集索引的順序進行存儲,一個表卻能有多個非聚集索引。我們已經討論了聚集索引的結構,這篇我們會看下非聚集索引結構。

非聚集索引的邏輯呈現

簡單來說,非聚集索引是表的子集。當我們定義了一個非聚集索引時,SQL Server把整套非聚集索引鍵存在不同的頁里。我們來看下一個包含BusinessEntityID(PK),PersonType,FirstName,LastName這4列的表,這個表上有一個非聚集索引定義。主體表按BusinessEntityID列(聚集索引鍵)的順序存儲。非聚集索引的存儲是與主體表分離的。如果你仔細看非聚集索引表,你會發現,記錄是按Firstname,lastname列的順序排列的。簡單理解下,非聚集索引就是主體表的子集。

假設現在我們要找出first name值為Michael的記錄。如果你從實體表找的話,我們需要從頭到腳把每條記錄匹配一次,因為記錄并沒有按first name列排序保存。如果這個表記錄有上千條記錄的話,這將是一個非常無聊且費時的工作。如果我們在非聚集索引表里找將會容易很多,因為這個表是按first name列以字母順序排列的。我們很容易定位到first name是Michael的記錄。我們并不需要再往下找,因為我們確定沒有更多的first name是Michael的記錄了。

現在我們得到了Firstname,lastname的值。那我們如何拿到其它2列的值?讓我們對非聚集索引做一些改動,將BusinessEntityID列也作為非聚集索引。

現在,一旦我們定位到記錄,我們可以使用BusinessEntityID(聚集索引鍵)列返回主體表,得到其他列的值,這個操作被稱為書簽查找(bookmark lookups)或RID查找。

聚集索引與非聚集索引

非聚集索引和聚集索引有一樣的B樹結構。非聚集索引鍵不會對主體表的數據排序做任何改變,因為聚集索引強制SQL Server將數據以聚集索引鍵的順序存儲。聚集索引的葉子層由包含表具體數據的數據頁組成,而非聚集索引的葉子層由索引頁組成。

非聚集索引可以定義在堆表或聚集表。在非聚集索引的葉子層,每個索引行包含非聚集索引鍵值和行定位器。這個定位器指向聚集索引或堆表的數據行。在非聚集索引行里的行定位器要么指向行,要么指向行聚集索引鍵。如果是堆表,它沒有聚集索引,行定位器是個指向行的指針。這個指針由頁里行的(文件號:頁號:槽號,file identifier :page number :slot number)組成。整個指針被稱為ROW ID(RID)。如果表有聚集索引,行定位器是行的聚集索引鍵。

非聚集索引深入淺出

我們用文章“索引深入淺出:聚集索引的B樹結構”用到的salesorderdetails創建一個非聚集索引,這個表在salesorderdetailid列有一個聚集索引。

1 CREATE UNIQUE INDEX Ix_PRoductId ON SalesOrderDetail(ProductId,Salesorderid) 

收集非聚集索引相關信息:

 1 TRUNCATE TABLE dbo.sp_table_pages 2 INSERT INTO sp_table_pages EXEC('DBCC IND(IndexDB,SalesOrderDetail,2)') 3 GO 4  5 SELECT * FROM dbo.sp_table_pages ORDER BY IndexLevel DESC --根節點/索引頁 6 DBCC TRACEON(3604) 7 DBCC PAGE(IndexDB,1,3472,3) 8  9 DBCC TRACEON(3604)10 DBCC PAGE(IndexDB,1,3416,3)--葉子節點/索引頁11 12 DBCC TRACEON(3604)13 DBCC PAGE(IndexDB,1,3557,3)--葉子節點/索引頁14 SELECT * FROM dbo.sp_table_pages WHERE IndexLevel=0 --葉子節點/索引頁

根據上述信息進行非聚集索引邏輯示意圖的繪制:

現在我們來分析下SQL Server如何存儲非聚集索引,首先我們通過DBCC IND命令查看非聚集索引的頁分配情況,最后一個參數,2是Ix_ProductId的索引號。

1 DBCC IND(IndexDB,SalesOrderDetail,2)

我們看到輸出結果一共有229條記錄,包含1個IAM頁和229個索引頁。我們可以通過找IndexLevel列值最大的記錄,來找根頁(root page)。記住索引層級是從葉子層向根層增長的。

1 SELECT * FROM dbo.sp_table_pages ORDER BY IndexLevel DESC --根節點/索引頁

在這個表里,我們根層(root leve)頁號是3472,index level是1,這就是說,這個非聚集索引的B樹結構只有根層(root level)和葉子層(leaf level),沒有中間層(intermediate level)。我們來看看3472頁。

1 DBCC TRACEON(3604)2 DBCC PAGE(IndexDB,1,3472,3)

返回結果一共有227條記錄(227個葉子層的索引頁)。部分結果如上所示。這和聚集索引里的根層(root)/中間層(intermediate)的頁結構是一樣的。productid與salesorderid組合的值小于或等于(707,51151)的所有記錄,可以在子頁3416里找到。productid與salesorderid組合的值在(707,51151)與(707,55920)之間的所有記錄,可以在子頁3417里找到,并以此類推。

我們來看看3417頁。

1 DBCC TRACEON(3604)2 DBCC PAGE(IndexDB,1,3417,3)

一共返回539條記錄,都是product id為707的記錄。這里的索引只用2層,這個是B樹結構的葉子層。你會注意到,這里沒有子頁ID列,但我們有salesorderdetailid列(聚集索引鍵),SQL Server用它來進行鍵或書簽查找操作。

我們來看看,SQL Server如何使用這個索引進行一個SELECT操作。點擊工具欄的顯示包含實際的執行計劃。

1 SET STATISTICS IO ON2 GO3 SELECT *  FROM SalesOrderDetail WHERE productid=707 AND SalesOrderid=51192 

可以看到執行計劃的鍵查找操作。因為這里where條件剛好完全符合我們非聚集索引定義,SQL Server用這個索引來執行查詢。首先SQL Server讀取B樹結構的根頁。我們的查詢條件組合(707,51192)落在根頁的第二條記錄上,因此SQL Server走到它的子頁(頁號3417)。在這個頁里,我們可以用條件組合(707,51192)定位到具體的記錄上,它的salesorderdetailid值是37793。從這里開始,SQL Server使用salesorderdetailid值進行鍵查找(key look up)操作。從上一個文章知道,但我們進行任何聚集索引鍵查找是,需要執行3個I/O。 因此這里,SQL Server需要執行5個I/O操作(2個在非聚集索引,3個在聚集索引的書簽/鍵查找(bookmark/key lookup),這個和你的結果輸出一致。

為了更好的理解它,我們可以把非聚集索引當作salesorderdetail表的一個子表(我們把它叫做Saleorderdetail_NC),有productid,salesorderid和 SalesorderDetailid列,并且ProductId與salesorderid列組合為聚集索引。上述查詢的結果可以通過以下2個查詢來獲得。

1 SELECT *  FROM SalesOrderDetail_nc WHERE productid=707 AND SalesOrderid=511922 GO3 SELECT *  FROM SalesOrderDetail WHERE SalesOrderDetailid=37793

我們再來看一個查詢:

1 SELECT *  FROM SalesOrderDetail WHERE productid=707

查詢返回3083條記錄,查詢條件與非聚集索引的第一列匹配。但是SQL Server并沒用非聚集索引來執行這個查詢,查詢計劃如下所示。

這樣做的原因是,如果使用非聚集索引,就需要為3083條記錄執行書簽查找(key lookup)。這會產生9249個I/O操作(3083*3)。因此,SQL Server使用了聚集索引掃描,它只需要1501(對于聚集索引樹結構需要的頁數)個I/O操作。如果我們做一個小的改動,只要Productid ,SalesOrderDetailid和SalesOrderId列,SQL Server會使用非聚集索引,因為它不需要進行書簽查找(bookmark lookup)操作。非聚集索引的葉子層已經包含這些列了。

1 SELECT productid,salesorderdetailid,salesorderid  FROM SalesOrderDetail WHERE productid=707

這篇文章真的有點長,而且我是該死的BING輸入法出錯,導致瀏覽器崩潰,丟失一個晚上3個小時成果,重新寫好的,希望大家看了之后可以透徹理解非聚集索引了,晚安各位??!2015-05-14 00:18:42


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91欧美精品午夜性色福利在线| 国产不卡一区二区在线播放| 色综合色综合网色综合| 国产午夜精品一区理论片飘花| 欧美亚洲国产视频| 国产精品久久久久久久app| 伊人激情综合网| 亚洲欧洲av一区二区| 久久伊人91精品综合网站| 中文字幕在线观看日韩| 91国内免费在线视频| 日韩午夜在线视频| 中文字幕日韩综合av| 国产伦精品一区二区三区精品视频| 国产精品无码专区在线观看| 国产精品久久久久久影视| 亚洲电影免费观看高清完整版在线观看| 亚洲国产精品va在线看黑人| 欧美日韩亚洲成人| 91热精品视频| 国产成人一区二区三区电影| 91在线无精精品一区二区| 亚洲免费小视频| 国产91精品在线播放| 欧美成人免费在线观看| 日韩在线观看电影| 国产91网红主播在线观看| 亚洲人成网站免费播放| 91精品在线看| 4k岛国日韩精品**专区| 国产噜噜噜噜久久久久久久久| 欧美在线免费观看| 亚洲人成网站999久久久综合| 欧美另类暴力丝袜| 国产精品午夜一区二区欲梦| 91网站在线免费观看| 国产日韩精品电影| 亚洲深夜福利网站| 国产91色在线免费| 欧美午夜久久久| 国产成人亚洲综合青青| www.亚洲免费视频| 国产福利视频一区二区| 国产精品1区2区在线观看| 韩国视频理论视频久久| 一色桃子一区二区| 亚洲人精选亚洲人成在线| 国产精品第10页| 欧美最猛性xxxxx亚洲精品| 欧美性猛交xxxx| 最近2019年手机中文字幕| 国产专区精品视频| 亚洲男人av在线| 中文字幕精品一区久久久久| 亚洲乱码一区二区| 8x海外华人永久免费日韩内陆视频| 国产精品中文在线| 色一情一乱一区二区| 国产精品亚洲自拍| 国产欧美精品日韩精品| 九九热精品在线| 日本在线精品视频| 日韩av在线天堂网| 深夜精品寂寞黄网站在线观看| 成人国产精品日本在线| 欧美成人黑人xx视频免费观看| 亚洲欧美在线免费观看| 国产精品美乳一区二区免费| 国产成人精品电影久久久| 久久九九热免费视频| 久热国产精品视频| 国产亚洲视频在线| 成人乱色短篇合集| xxxx性欧美| 国产精品第二页| 色视频www在线播放国产成人| 亚洲精品欧美一区二区三区| 国产精品欧美一区二区三区奶水| 亚洲欧美制服另类日韩| 2024亚洲男人天堂| 91av成人在线| 黑人精品xxx一区一二区| 精品久久久久久久久久国产| 性欧美xxxx交| 色综合久久88色综合天天看泰| 日韩欧美中文字幕在线播放| 日本a级片电影一区二区| 精品二区三区线观看| 成人高h视频在线| 中文字幕自拍vr一区二区三区| 欧美丝袜第一区| 久久久久久久久中文字幕| 91欧美精品成人综合在线观看| 国产精品99久久久久久www| 日韩成人中文字幕| 成人乱色短篇合集| 国产v综合v亚洲欧美久久| 国产视频福利一区| 亚洲国产欧美精品| 亚洲天堂av高清| 久久久久国产精品www| 一区二区av在线| 国产国语videosex另类| 国产精品一区二区久久精品| 日韩中文字在线| 国产美女直播视频一区| 欧美性猛交丰臀xxxxx网站| 91国在线精品国内播放| 九九精品在线观看| 久久视频在线直播| 97在线精品视频| 91po在线观看91精品国产性色| 久久中文字幕视频| 2025国产精品视频| 欧美激情视频免费观看| 亚洲综合小说区| 在线电影av不卡网址| 国产精品久久久久久亚洲调教| 日韩中文字幕不卡视频| 亚洲精品www久久久| 亚洲性夜色噜噜噜7777| 久国内精品在线| 日本久久久久久久久| 日韩激情片免费| 中文字幕日韩欧美在线视频| 福利二区91精品bt7086| 丝袜美腿精品国产二区| 久久国产精品偷| 精品国偷自产在线视频99| 国产在线观看91精品一区| 亚洲人成伊人成综合网久久久| 久久亚洲国产精品成人av秋霞| 欧美日韩国产精品一区二区不卡中文| 欧日韩不卡在线视频| 91系列在线播放| 自拍偷拍亚洲一区| 日韩中文字幕视频在线| 久久香蕉精品香蕉| 伊人亚洲福利一区二区三区| 亚洲www视频| 欧美日韩一区二区三区| 欧美中文在线观看国产| 精品成人av一区| 激情成人中文字幕| 热久久免费视频精品| 91系列在线播放| 视频在线观看99| 国产精品网站视频| 欧美日韩国产一区在线| 亚洲国产精品中文| 成人免费观看网址| 久久久久久美女| 欧美大片第1页| 人妖精品videosex性欧美| 亚洲综合一区二区不卡| 欧美一区二三区| 欧美精品激情在线| 91精品视频在线看| 最近2019年好看中文字幕视频| 久久国产精品久久久久| 国内自拍欧美激情| 欧美www在线| 成人黄色激情网| 国产午夜精品美女视频明星a级|