下載吧 - 綠色安全的游戲和軟件下載中心

          軟件下載吧

          當(dāng)前位置:軟件下載吧 > 數(shù)據(jù)庫(kù) > MS_SQL > SQL開(kāi)發(fā)知識(shí):SQL Server索引的原理深入解析

          SQL開(kāi)發(fā)知識(shí):SQL Server索引的原理深入解析

          時(shí)間:2024-02-28 13:28作者:下載吧人氣:19

          1.聚集索引和非聚集索引
            2.索引的結(jié)構(gòu)
              3.索引包含列和書簽查找
                前言

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

                索引的概念

                索引的用途:我們對(duì)數(shù)據(jù)查詢及處理速度已成為衡量應(yīng)用系統(tǒng)成敗的標(biāo)準(zhǔn),而采用索引來(lái)加快數(shù)據(jù)處理速度通常是最普遍采用的優(yōu)化方法。

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

                索引的利弊:查詢執(zhí)行的大部分開(kāi)銷是I/O,使用索引提高性能的一個(gè)主要目標(biāo)是避免全表掃描,因?yàn)槿頀呙栊枰獜拇疟P上讀取表的每一個(gè)數(shù)據(jù)頁(yè),如果有索引指向數(shù)據(jù)值,則查詢只需要讀少數(shù)次的磁盤就行啦。所以合理的使用索引能加速數(shù)據(jù)的查詢。但是索引并不總是提高系統(tǒng)的性能,帶索引的表需要在數(shù)據(jù)庫(kù)中占用更多的存儲(chǔ)空間,同樣用來(lái)增刪數(shù)據(jù)的命令運(yùn)行時(shí)間以及維護(hù)索引所需的處理時(shí)間會(huì)更長(zhǎng)。所以我們要合理使用索引,及時(shí)更新去除次優(yōu)索引。

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

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

          1.1 聚集索引

          表的數(shù)據(jù)是存儲(chǔ)在數(shù)據(jù)頁(yè)中(數(shù)據(jù)頁(yè)的PageType標(biāo)記為1),SqlServer一頁(yè)是8k,存滿一頁(yè)就開(kāi)辟下一頁(yè)存儲(chǔ)。如果表有聚集索引,那么一筆一筆物理數(shù)據(jù)就是按聚集索引字段的大小升/降排序存儲(chǔ)在頁(yè)中。當(dāng)對(duì)聚集索引字段更新或中間插入/刪除數(shù)據(jù)時(shí),都會(huì)導(dǎo)致表數(shù)據(jù)移動(dòng)(造成性能一定影響),因?yàn)樗3稚?降排序。

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

          一個(gè)優(yōu)秀的聚集索引字段一般包含以下4個(gè)特性:

          (A).自增長(zhǎng)

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

          (B).不被更改

          減少數(shù)據(jù)移動(dòng)。

          (C).唯一性

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

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

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

          為了“鍵值”唯一性,對(duì)于聚集索引,uniquifier 列只在索引值重復(fù)時(shí)增加。對(duì)于非聚集索引,如果創(chuàng)建索引時(shí)沒(méi)定義唯一,RID會(huì)在所有記錄增加,就算索引值是唯一的;如果創(chuàng)建索引時(shí)定義唯一,RID只在葉子層增加,用于查找源數(shù)據(jù)行,即書簽查找操作。

          (D).字段長(zhǎng)度小

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

          1.2 非聚集索引

          也是存儲(chǔ)在頁(yè)中(PageType標(biāo)記為2的頁(yè),叫索引頁(yè))。比如表T建立了一個(gè)非聚集索引Index_A,那么表T有100條數(shù)據(jù)的話,那么索引Index_A也就有100條數(shù)據(jù)(準(zhǔn)確的說(shuō)是100條葉子節(jié)點(diǎn)數(shù)據(jù),索引是B樹(shù)結(jié)構(gòu),如果樹(shù)的高度大于0,那么就有根節(jié)點(diǎn)頁(yè)或中間節(jié)點(diǎn)頁(yè)數(shù)據(jù),這時(shí)索引數(shù)據(jù)就超過(guò)100條),如果表T還有非聚集索引Index_B,那么Index_B也是至少100條數(shù)據(jù),所以索引建越多開(kāi)銷越大。

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

          2.索引的結(jié)構(gòu)

          都說(shuō)SqlServer的索引是B樹(shù)結(jié)構(gòu)(這邊假定你對(duì)B樹(shù)結(jié)構(gòu)有一定了解),那它到底長(zhǎng)什么個(gè)模樣呢,可以用Sql語(yǔ)句來(lái)查看它的邏輯呈現(xiàn)。

          新建查詢執(zhí)行語(yǔ)法: DBCC IND(Test,OrderBo,-1) –其中Test庫(kù)的OrderBo表有1萬(wàn)筆數(shù)據(jù),有聚集索引Id主鍵字段
          (不妨自己動(dòng)手建個(gè)表,有聚集索引字段,插入1萬(wàn)表數(shù)據(jù),然后執(zhí)行這個(gè)語(yǔ)法看看,會(huì)收獲很多,百聞不如一見(jiàn))

          執(zhí)行結(jié)果:

          SQL開(kāi)發(fā)知識(shí):SQL Server索引的原理深入解析

          如上圖,看到一個(gè)IndexLevel=2的索引頁(yè)2112(這邊它就是B樹(shù)的根節(jié)點(diǎn),IndexLevel最大的就是根節(jié)點(diǎn),往下就是子級(jí)、子子級(jí)…只有一個(gè)根頁(yè)作為B樹(shù)結(jié)構(gòu)的訪問(wèn)入口點(diǎn)),說(shuō)明一定還有IndexLevel=1的索引頁(yè)和IndexLevel=0的葉子頁(yè)。由于這邊是聚集索引,因此當(dāng)IndexLevel=0的葉子頁(yè)就是數(shù)據(jù)頁(yè),存儲(chǔ)的是一筆一筆的物理數(shù)據(jù)。如上圖也可以看到,IndexLevel=0的行的PageType等于1,就是代表數(shù)據(jù)頁(yè),上面1.1章節(jié)講到聚集索引時(shí),也有提到PageType=1;而如果是非聚集索引,IndexLevel=0的葉子頁(yè),PageType是等于 2,仍然是索引頁(yè)。

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

          — DBCC TRACEON(3604,-1)
          DBCC PAGE(Test,1,2112,3)
          –根節(jié)點(diǎn)2112,可以查出它的兩個(gè)子節(jié)點(diǎn)2280和2448,然后對(duì)這兩個(gè)子節(jié)點(diǎn)再作DBCC PAGE查詢
          DBCC PAGE(Test,1,2280,3)
          DBCC PAGE(Test,1,2448,3)

          標(biāo)簽MSSQL,SQLServer,技術(shù)文檔,數(shù)據(jù)庫(kù),SQLSERVER

          相關(guān)下載

          查看所有評(píng)論+

          網(wǎng)友評(píng)論

          網(wǎng)友
          您的評(píng)論需要經(jīng)過(guò)審核才能顯示

          熱門閱覽

          最新排行

          公眾號(hào)

          主站蜘蛛池模板: 老熟妇高潮一区二区三区| 无码人妻精品一区二区三区99仓本 | 中文字幕一区一区三区| 在线精品国产一区二区三区| 久草新视频一区二区三区| 久久精品黄AA片一区二区三区| 在线播放国产一区二区三区| 国产成人一区二区三区| 美女视频一区二区三区| 亚洲一区二区女搞男| 在线播放一区二区| 一本色道久久综合一区| 亚洲AV午夜福利精品一区二区| 亚洲av无码成人影院一区| 国产成人久久精品麻豆一区| 亚洲国产综合精品中文第一区| 成人精品一区二区激情| 波多野结衣免费一区视频| 国产一区二区不卡老阿姨| 久久国产精品一区| 国产精品香蕉一区二区三区| 成人国产精品一区二区网站| 人妻无码一区二区不卡无码av| 日本v片免费一区二区三区| 久久se精品一区精品二区| 国产精品视频免费一区二区| 99精品久久精品一区二区| 久久精品免费一区二区| 一区二区三区电影网| 午夜影院一区二区| 国产成人一区二区三区在线| 亚洲熟妇AV一区二区三区宅男| 精品少妇一区二区三区在线 | 日本一区视频在线播放| 亚洲视频一区调教| 国产成人精品无人区一区| 亚洲乱色熟女一区二区三区蜜臀| 中文字幕一区二区三区在线播放| 欧美av色香蕉一区二区蜜桃小说| 国产午夜福利精品一区二区三区 | 国产乱子伦一区二区三区|