日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 數據庫 > SQL Server > 正文

SQL Server索引的原理深入解析

2024-08-31 01:05:23
字體:
來源:轉載
供稿:網友

前言

此文是我之前的筆記整理而來,以索引為入口進行探討相關數據庫知識(又做了修改以讓人更好消化)。SQL Server接觸不久的朋友可以只看以下藍色字體字,簡單有用節省時間;如果是數據庫基礎不錯的朋友,可以全看,歡迎探討。

索引的概念

索引的用途:我們對數據查詢及處理速度已成為衡量應用系統成敗的標準,而采用索引來加快數據處理速度通常是最普遍采用的優化方法。

索引是什么:數據庫中的索引類似于一本書的目錄,在一本書中使用目錄可以快速找到你想要的信息,而不需要讀完全書。在數據庫中,數據庫程序使用索引可以重啊到表中的數據,而不必掃描整個表。書中的目錄是一個字詞以及各字詞所在的頁碼列表,數據庫中的索引是表中的值以及各值存儲位置的列表。

索引的利弊:查詢執行的大部分開銷是I/O,使用索引提高性能的一個主要目標是避免全表掃描,因為全表掃描需要從磁盤上讀取表的每一個數據頁,如果有索引指向數據值,則查詢只需要讀少數次的磁盤就行啦。所以合理的使用索引能加速數據的查詢。但是索引并不總是提高系統的性能,帶索引的表需要在數據庫中占用更多的存儲空間,同樣用來增刪數據的命令運行時間以及維護索引所需的處理時間會更長。所以我們要合理使用索引,及時更新去除次優索引。

1.聚集索引和非聚集索引

索引分為聚集索引和非聚集索引

1.1 聚集索引

表的數據是存儲在數據頁中(數據頁的PageType標記為1),SqlServer一頁是8k,存滿一頁就開辟下一頁存儲。如果表有聚集索引,那么一筆一筆物理數據就是按聚集索引字段的大小升/降排序存儲在頁中。當對聚集索引字段更新或中間插入/刪除數據時,都會導致表數據移動(造成性能一定影響),因為它要保持升/降排序。

注意,主鍵只是默認是聚集索引,它也可以設置為非聚集索引,也可以在非主鍵字段上設置為聚集索引,全表只能有一個聚集索引。

一個優秀的聚集索引字段一般包含以下4個特性:

(A).自增長

總是在末尾增加記錄,減少分頁和索引碎片。

(B).不被更改

減少數據移動。

(C).唯一性

唯一性是任何索引最理想的特性,可以明確索引鍵值在排序中的位置。

更重要的是,索引鍵指唯一的話,它在每條記錄里才可以正確指向源數據行RID。如果聚集索引鍵值不唯一,SqlServer就需要內部生成uniquifier 列組合當作聚集鍵保證“鍵值”唯一性;如果非聚集索引鍵值不唯一,就會增加RID列(聚集索引鍵或者堆表中的行指針)保證“鍵值”唯一性。

思考(可略過):索引“鍵值”在非葉子節點也有保證唯一性,原因應該是為了明確索引記錄在非葉子節點中的位置。比如有個非聚集索引字段Name2,表中有很多Name2='a'的記錄,導致Name2='a'在非葉子節點上有多條索引記錄(節點),這時候再insert一筆Name2=‘a'的記錄時,就可以根據非葉子節點的RID和新增記錄的RID很快確定要insert到哪個索引記錄(節點)上,如果沒有非葉子節點的RID,那得遍歷到所有Name2='a'的葉子節點才能確定位置。另外,當我們select * from Table1 where Name2<='a'時,返回的數據是按非聚集索引Name2和RID排序的,很好理解返回的數據就是按這邊索引存儲的順序排序的。這是這條sql查詢時有用到Name2索引的結果,如果數據庫查詢計劃因“臨界點”問題選擇直接表數據掃描,那返回的數據默認就是按表數據的順序排序的。

為了“鍵值”唯一性,對于聚集索引,uniquifier 列只在索引值重復時增加。對于非聚集索引,如果創建索引時沒定義唯一,RID會在所有記錄增加,就算索引值是唯一的;如果創建索引時定義唯一,RID只在葉子層增加,用于查找源數據行,即書簽查找操作。

(D).字段長度小

聚集索引鍵長度越小,一頁索引頁就可以容納更多索引記錄,進而減少索引B樹結構的深度。例如,一個百萬記錄的表有一個int聚集索引,可能只需要3層的B樹結構。如果把聚集索引定義在更寬的列(比如uniqueidentifier列需要16 字節),那么索引的深度會增加到4層。任何聚集索引查找需要4個I/O操作(確切的說是4個邏輯讀),原先只要3個I/O操作。
同樣,非聚集索引里會包含聚集索引鍵值,聚集索引鍵長度越小非聚集索引記錄也就越小,一頁索引頁就可以容納更多索引記錄。

1.2 非聚集索引

也是存儲在頁中(PageType標記為2的頁,叫索引頁)。比如表T建立了一個非聚集索引Index_A,那么表T有100條數據的話,那么索引Index_A也就有100條數據(準確的說是100條葉子節點數據,索引是B樹結構,如果樹的高度大于0,那么就有根節點頁或中間節點頁數據,這時索引數據就超過100條),如果表T還有非聚集索引Index_B,那么Index_B也是至少100條數據,所以索引建越多開銷越大。

更新索引字段、插入一條數據、刪除一條數據都會造成索引的維護從而造成性能的一定影響。在不同情況下,性能影響是不同的。比如當你有一個聚集索引,插入的數據又都是在末尾,這樣幾乎是不會造成數據移動,影響較??;如果插入的數據在中間位置,一般會導致數據移動,而且可能產生分頁和頁碎片,影響就會稍大一點(如果插入到的中間頁有足夠的剩余空間容納插入的數據,而且位置是在頁末,也是不會造成數據移動)

2.索引的結構

都說SqlServer的索引是B樹結構(這邊假定你對B樹結構有一定了解),那它到底長什么個模樣呢,可以用Sql語句來查看它的邏輯呈現。

新建查詢執行語法: DBCC IND(Test,OrderBo,-1) --其中Test庫的OrderBo表有1萬筆數據,有聚集索引Id主鍵字段
(不妨自己動手建個表,有聚集索引字段,插入1萬表數據,然后執行這個語法看看,會收獲很多,百聞不如一見)

執行結果:

SQLServer,索引

如上圖,看到一個IndexLevel=2的索引頁2112(這邊它就是B樹的根節點,IndexLevel最大的就是根節點,往下就是子級、子子級...只有一個根頁作為B樹結構的訪問入口點),說明一定還有IndexLevel=1的索引頁和IndexLevel=0的葉子頁。由于這邊是聚集索引,因此當IndexLevel=0的葉子頁就是數據頁,存儲的是一筆一筆的物理數據。如上圖也可以看到,IndexLevel=0的行的PageType等于1,就是代表數據頁,上面1.1章節講到聚集索引時,也有提到PageType=1;而如果是非聚集索引,IndexLevel=0的葉子頁,PageType是等于 2,仍然是索引頁。

同樣,我們用Sql命令DBCC PAGE看一看

-- DBCC TRACEON(3604,-1) DBCC PAGE(Test,1,2112,3)  --根節點2112,可以查出它的兩個子節點2280和2448,然后對這兩個子節點再作DBCC PAGE查詢DBCC PAGE(Test,1,2280,3) DBCC PAGE(Test,1,2448,3)

SQLServer,索引

如上圖,IndexLevel=2的2112頁有兩個IndexLevel=1的子節點2280和2448,子節點下又有子節點,每個節點負責不同的索引鍵值的區間(即上圖的“Id(key)”欄位,第一行值是Null,表示最小值或倒序時的最大值)。這樣的層級關系是不是就是一棵B樹結構,其中IndexLevel其實就是B樹結構中的高度Height。

SqlServer在索引中查找某一筆記錄時,是從根節點往下找到葉子節點,因為所有數據地址都有存在葉子節點,這其實是B+樹的特點之一(B樹特點是如果查找的值在非葉子節點就找到,則就能直接返回,顯然SqlServer不是這么做,要驗證這一點你可以set statistics io on把統計開起來,然后select看下邏輯讀的次數)。

既然一定會找到葉子節點,那么索引包含列只要在葉子節點記錄就可以了,即非葉子節點沒有記錄包含列,“索引包含列”見下文第3章節。

B+樹這個特點(所有數據地址都有存在葉子節點)也利于between value1 and value2 區間查詢,只要找到value1和value2(在葉子節點),然后把中間串起來就是要的結果了。

SqlServer索引結構更像是B+樹,最終是B樹和B+樹的混合版,數據結構都是人定的,不一定就是純粹的B樹或者單純的B+樹。

3.索引包含列和書簽查找

談到索引,這邊再講一個SqlServer2005開始增加的“索引包含列”功能,很實用。

比如,在大報表查詢數據時,where條件用到索引字段Name2,但是要select的字段是Name1,這時候可以使用“索引包含列”把Name1包含在索引字段Name2中,大大提高查詢性能。

語法: Create [UNIQUE]  Nonclustered/Clustered Index IndexName On dbo.Table1(Name2) Include(Name1);

接下來分析為什么索引包含列可以大大提高性能。仍然使用DBCC PAGE命令,查看一個非聚集索引并有包含列的索引數據情況:

SQLServer,索引

由上圖可知,包含列Name1也存儲在索引數據中。因此,當數據庫用索引字段Name2定位到要查找的某一行時,就可以直接把Name1的值返回了,而不用再根據RID(上圖是【HEAP RID(Key)】列)定位到數據頁中去取值,即減少了書簽查找。當查詢只返回一條數據,只有一次書簽查找時當然沒什么,如果查詢返回的數據很大,每一筆都要去數據頁找數據取出來,1000筆就是1000次書簽查找,可想而知性能消耗很大,這時候“索引包含列”價值就大大體現出來了。

關于一次書簽查找,表有聚集索引(比如Id)時就是類似執行了一次 select Name1 from Table1 where Id=1 ,利用聚集索引鍵Id查找(查找方式就是索引Id的B樹結構查找),而如果表沒有聚集索引,則是根據數據行指針(由“文件號2byte:頁號4byte:槽號2byte”組成)查找。聚集索引鍵和行指針一般統稱為RID(Row ID)指針。從這里我們可以想到,如果你的表沒有很好的聚集索引字段,建議自增長的Id字段做聚集索引主鍵(冗余出Id字段也行),它符合自增長、不被更改、唯一性、長度小的特性,是聚集索引的很好選擇。

自增長Id絕大部分情況下是適用的,特殊的情況看具體需求而定吧。還有自增長Id要考慮一個缺陷,當對表大數據量的并發insert記錄時,可以想象每個線程都是要insert到末尾那個頁,就會發生競爭和等待。解決這種情況你可以用uniqueidentifier類型字段(16字節,我是不建議使用)或者哈希分區(就是一個表分成多個表,大數據處理中分庫分表是正常的)等。但是我建議先優化你的insert效率(insert性能本身是很快的),測試每秒并發insert數是否滿足生產環境,以保留簡單穩定高效的自增長Id作法。

自增長Id不一定就是用數據庫提供的自增長,你也可以自己寫算法生成一個并發情況下也能唯一的Id(這時候一般長度是bitint,8字節整形),這種情況適合場景是分布式數據庫中主從復制時Id欄位是要求一定不能出錯的情況(主從復制的一般模式下,主庫的Id是按主庫增長,從庫Id也是按從庫自己的增長,如果遇到死鎖等原因導致主從復制不同步時,那從庫的Id就和主庫的Id自增長就對不上號了)。如果自增長Id是冗余出的主鍵,那主從庫Id對不上號也就無影響。

另外,上圖最后一列【Row Size】還告訴我們,索引列或索引包含列的size不要太長,否則一頁容不了幾筆記錄,這樣大大增加了索引頁數量,而且索引數據所占的空間也大大增加了。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到MSSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
日本精品免费观看高清观看| 亚洲午夜久久| 日韩欧中文字幕| 91精品国产91| 精品国产99| 日韩午夜中文字幕| 日韩欧美中文字幕在线观看| 九一精品国产| 日韩中文欧美| 国产欧美日韩精品综合| 国产午夜精品视频| 午夜少妇久久久久久久久| 精品久久久久久无| 国产免费播放一区二区| 日韩精品乱码av一区二区| 亚洲小说春色综合另类网蜜桃| 国产视频二区| 欧美日韩成人一区二区| 国产高清精品在线观看| 91精品视频播放| 欧美精品一区二区三区在线播放| 粉嫩粉嫩芽的虎白女18在线视频| 亚洲国产欧美日韩精品| 国产自产视频| 亚洲日本精品视频| 中文字幕欧美日韩va免费视频| 最近中文av字幕在线中文| 国产不卡视频在线| 日韩专区视频网站| 久久久综合av| 欧美日韩国产一区中文午夜| 免费精品国产自产拍观看| 亚洲一区精品在线| 欧美高清一级片在线| 欧美三级中文字幕| 日韩网站中文字幕| 欧美久久一二三四区| 欧美日韩激情一区二区三区| 国产欧美日韩中文久久| 亚洲视频 中文字幕| 精品在线网站观看| 中文字幕一区不卡| 欧美日韩综合色| 国产婷婷在线观看| 中文在线第一页| 国产一级粉嫩xxxx| 色综合婷婷久久| 97国产视频| 国内国产区免费视频| 午夜高潮免费视频| wwww亚洲| 国产伦精品免费视频| 久久精品国产2020观看福利| 亚洲高清视频一区| 国产不卡在线观看视频| 欧美三级在线视频| 欧美亚洲国产激情| 日韩亚洲欧美中文高清在线| 国产免费电影网站入口| 亚洲一级在线| 又黄又www的网站| 国产在线精品国自产拍免费| 国产日韩三级| 91精品国产入口| 日本亚洲欧美三级| 正在播放日韩精品| 日韩欧美综合在线| 色综合婷婷久久| 在线观看国产福利视频| 一区二区三区高清在线| 77777_亚洲午夜久久多人| 欧美日韩在线三级| 日韩精品福利一区二区三区| 一区二区三区精品在线| 日本中文字幕在线观看| 欧美日韩视频网站| 天堂在线一区二区三区| 日韩中文字幕在线观看视频| 高清一区二区| 久久99久久久久久久噜噜| 欧美日韩亚洲视频| 精品一区二区在线观看视频| 中文字幕在线观看播放| 欧美国产一区视频在线观看| 欧美亚洲综合视频| 日韩欧美中文字幕在线播放| 国产自产视频| 欧美一级在线免费| 色猫猫国产区一区二在线视频| 精品免费久久久| 91精品日本| 日韩中文欧美| 国产在线观看色| 日韩精品视频免费| 日韩欧美高清在线| 欧美日韩国产中文精品字幕自在自线| 国产字幕在线看| 91精品综合久久久久久| 首页国产欧美久久| 狠狠色综合色区| 亚洲 欧美 日韩系列| 一区二区三区久久| 国产网站av| 中文不卡在线| 国产福利精品导航| 日韩三级一区| 亚洲成年人影院在线| 国产一卡2卡3卡4卡网站免费 | 欧美日韩国产专区| 亚洲综合在线不卡| 自拍日韩亚洲一区在线| 亚洲3区在线| 中文字幕在线观看视频www| 亚洲综合在线视频| 国产真实乱子伦精品视频| 久久麻豆视频| 久久精品网站免费观看| 在线视频你懂得一区| 精品av中文字幕在线毛片| 国产999精品在线观看| 中文亚洲欧美| 国产在线精品国自产拍免费| 婷婷综合福利| 精品播放一区二区| aaa欧美日韩| 午夜伊人狠狠久久| 91精品久久久久久久91蜜桃| 欧美日韩精品中文字幕| 91av久久久| 美女黄a一级视频| 精品在线91| 欧美亚洲专区| 国产成人精品综合久久久| 日韩在线精品视频| 亚洲一区激情| 91精品国产91| 日韩在线不卡一区| 日韩视频一区| 国产欧美自拍一区| 91麻豆精品国产91久久久使用方法| 欧美日韩精品是欧美日韩精品| 亚洲综合日韩中文字幕v在线| 日韩欧美视频一区二区三区四区| 日韩视频专区| 亚洲福利精品在线| 日韩在线视频一区| 日韩欧美一级在线| 国产福利免费在线观看| 日韩欧美中文字幕精品| 欧美日韩亚洲一| 69av亚洲| 日韩欧美三级视频| 欧美日韩精品在线视频| 久久精品最新免费国产成人| 91蜜桃婷婷狠狠久久综合9色| 国产高潮久久久| 亚洲乱码一区av黑人高潮| 欧美中文字幕在线| 精品对白一区国产伦| 在线观看中文字幕一区| 一区二区三区免费看视频| 精品999视频| 精品国产欧美日韩不卡在线观看| 一区二区三区在线不卡| 精品国产免费视频| 中文字幕在线观看欧美| 亚洲一区精品电影| 日韩高清不卡| 中文字幕 欧美 日韩| 91精品国产丝袜白色高跟鞋| 亚洲欧洲一区二区天堂久久| 日韩高清在线一区二区| 国产一级久久久| 欧美日韩国产高清一区| 日韩欧美中文字幕在线播放| 亚洲福利在线视频| 中文字幕欧美日韩在线| 国产一二三区精品视频| 日韩欧美字幕| 日韩精品在线观看视频| 中文字幕视频在线免费欧美日韩综合在线看| 亚洲最新永久观看在线| 国产黄在线观看| 中文字幕在线视频网| 国产在线观看黄色| 亚洲一二三不卡| 中文字幕第一页在线| 日韩欧美看国产| 欧美日韩一二三| 一区二区欧美国产| 国产99对白在线播放| 中文字幕狠狠干| 日韩av中文字幕一区| 精品色蜜蜜精品视频在线观看| 一二三区精品视频| 亚洲大片精品永久免费| www.狠狠干| 日韩一级网站| 91精品在线观看视频| 久久99精品久久久久子伦| 亚洲天堂国产视频| 国产丝袜欧美中文另类| 国产最新在线| 精品日韩av一区二区| 欧美日韩精品不卡| 日韩国产欧美三级| 久久香蕉av| 中文欧美字幕免费| 亚洲 欧美 精品| 中文字幕在线亚洲| 国产永久在线观看| 欧美在线视频第一页| 一区视频在线播放| 国产95在线|亚洲| 91精品国产自产在线| av手机天堂| 欧美中文字幕在线观看视频| 国产永久在线观看| 日韩视频精品| 欧美日韩高清一区二区不卡| 亚洲精华国产欧美| 国产免费电影网站入口| 亚洲一二三不卡| 欧美日韩第一区日日骚| 国产91一区| 欧美二三四区| 欧美国产一级片| 日韩一级在线免费观看| 中文字幕欧美日韩| 精品播放一区二区| 欧美不卡123| 日韩精品丝袜在线| 日韩精品视频在线免费观看| 欧美日韩视频免费看| 91精选在线| 中文在线а√在线8| 不卡中文一二三区| 欧美日韩一区二区在线视频| 日韩视频一区在线观看| 国产高清一区| 中文字幕在线播放一区| 日本黄色一区二区三区| 色国产在线视频| 三级网站免费观看| 欧美中文字幕在线| 国产欧美日韩91| 中文字幕亚洲乱码| 日韩欧美不卡| 日韩欧美一卡二卡| 亚洲欧美中文字幕在线一区| 亚洲乱码中文字幕| 91精品国产色综合久久不卡蜜臀| 日韩国产高清一区| www.三级.com| 尤物av一区二区| 日韩在线 中文字幕| 欧美日韩视频免费看| 日韩中文字幕视频在线观看| 国产不卡在线| 日韩av一区二区在线| 亚洲 欧美 中文字幕| 日韩视频一区二区在线观看| 91精品久久久久久久久久入口| 国产高清一级片| 欧美日韩精品免费| 欧美日韩综合高清一区二区| 亚洲高清视频在线| 一区二区视频在线观看免费的| 欧美日韩午夜精品| 97视频在线| 色猫猫国产区一区二在线视频| www中文字幕| 日韩在线观看精品| 欧美日韩中国免费专区在线看| 国产视频中文字幕| 久久精品黄色片| 欧美日本精品| 精品视频三区| 国产69精品久久久久孕妇国产69久久| 欧美日韩日本视频| 欧美日韩国产专区| 日韩精品三级| 亚洲一区精品电影| 精品1区2区3区| 国产色综合网| 国产不卡一区| 成人福利一区| 亚洲福利在线观看| 国产午夜精品久久| 日韩在线视频一区二区三区| 精品亚洲成a人片在线观看| 日韩三级一区二区| 国产日韩精品在线看| 亚洲日本精品视频| 中文字幕伊人| 日韩精品一页| 中文字幕在线视频日韩| 久久精品免费在线观看| 亚洲第一视频在线观看| 精品在线网站观看| 日韩a一区二区| 中文在线视频观看| 亚洲一区激情| 国产成人精品免费网站| 中文在线不卡视频| 国产不卡视频在线| 交视频在线观看国产| 久久人人精品| 精品久久久精品| 中文字幕日韩第一页| 91蜜桃在线视频| 日韩在线视频一区二区三区| 日韩精品在线免费观看| 亚洲一区在线观看视频| 91精品在线国产| 国产绿帽一区二区三区| 91精品国产91久久久| 一区二区不卡视频在线观看| 国产一级视频| 在线视频国内一区二区| 日韩一级免费在线观看| 日韩精品不卡一区二区| 欧美日韩中文国产| 99pao成人国产永久免费视频| 最近中文字幕日韩精品| av免费在线播放| 欧美日韩国产系列| 国产免费一级| 天天综合天天添夜夜添狠狠添| 日本国产一区| 国产在线二区| 亚洲综合在线中文字幕| 亚洲欧美视频一区二区三区| 日韩在线视频一区| 欧美片网站免费| 中文字幕在线播放一区| 欧美日韩综合视频网址| 免费网站看黄yyy222| 国产成人精品综合久久久| 日韩免费视频| 国产黄色在线| 国产视频97| 日韩欧美国产成人精品免费| 中文字幕视频一区二区三区久| 欧美二三四区| 欧美日韩国产免费观看| 午夜国产视频| 国产在线一在线二| 国产欧美在线观看| 亚洲第一网中文字幕| 欧美亚洲专区| 日韩色在线观看| 日韩欧美专区在线| 日韩欧美在线综合网| 日韩精品在线观看网站| 在线视频国内一区二区| 亚洲欧美中文字幕| 日韩精品视频在线播放| 亚洲欧美日本另类| 中文字幕亚洲第一| 欧美日韩中文另类| 欧美日韩国产黄色| 国产区在线看| 中文字幕 欧美日韩| 亚洲乱码在线观看| 在线视频1区2区| 精品无人国产偷自产在线| 久久99久久久欧美国产| 一区二区中文字幕在线| 日韩免费精品视频| www在线视频| 色综合影院在线| 精品成人久久久| 亚洲校园欧美国产另类| 亚洲高清视频在线| 国产卡1卡2卡三卡在线| 九九九精品视频| 日韩在线中文字幕| 欧美一级久久| 欧美亚洲免费高清在线观看| 一区二区三区视频网站| 亚洲一区在线观看免费| 黄色在线播放网站| 一区二区三区四区五区视频在线观看| 极品久久久久久| 日韩av一区二区在线| 亚洲最新永久观看在线| 亚洲永久免费视频| 欧美日韩视频网站| 国产欧美日韩中文字幕| 日韩欧美在线影院| 欧美日韩国产成人| 国产欧美日韩在线看| 天天综合天天添夜夜添狠狠添| 精品欧美久久久| 亚洲羞羞网站| 国产91久久久久蜜臀青青天草二 | 内射国产内射夫妻免费频道| 福利一区二区| 在线日韩欧美|