版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、SQL Server 2000的物理存儲(chǔ)與索引結(jié)構(gòu)10/15/20221SQL Server 2000的物理存儲(chǔ)與索引結(jié)構(gòu)10/SQL Server 2000的物理存儲(chǔ)與索引結(jié)構(gòu)數(shù)據(jù)庫(kù)與數(shù)據(jù)庫(kù)文件表的物理存儲(chǔ)索引及行操作10/15/20222SQL Server 2000的物理存儲(chǔ)與索引結(jié)構(gòu)數(shù)據(jù)庫(kù)與SQL Server 2000的物理存儲(chǔ)與索引結(jié)構(gòu)索引及行操作10/15/20223SQL Server 2000的物理存儲(chǔ)與索引結(jié)構(gòu)索引及行認(rèn)識(shí)SQL Server數(shù)據(jù)庫(kù)索引SQL Server采用標(biāo)準(zhǔn)的B-樹(shù)來(lái)存儲(chǔ)索引信息;SQL Server的索引由根級(jí)頁(yè)、中間級(jí)頁(yè)和葉級(jí)頁(yè)組成;索引的級(jí)數(shù)與表
2、中行的多少和索引碼的大小有關(guān);SQL Server的索引分為簇集索引和非簇集索引兩種。10/15/20224認(rèn)識(shí)SQL Server數(shù)據(jù)庫(kù)索引SQL Server采用標(biāo)認(rèn)識(shí)SQL Server數(shù)據(jù)庫(kù)索引10/15/20225認(rèn)識(shí)SQL Server數(shù)據(jù)庫(kù)索引10/11/20225索引及行操作基本原理SQL Server的索引組織在SQL Server中創(chuàng)建索引SQL Server的索引頁(yè)結(jié)構(gòu)索引的空間需求索引的管理SQL Server的特殊索引插入行分裂頁(yè)刪除行更新行10/15/20226索引及行操作基本原理插入行10/11/20226基本原理堆文件這是最簡(jiǎn)單、最原始、也是最早使用的一種文件結(jié)
3、構(gòu);文件中的記錄在邏輯上沒(méi)有特定的次序,在物理上也不一定鄰接,就好像是堆在一起一樣;這種文件插入很容易,但查找就不方便了,需要順序掃描文件。10/15/20227基本原理堆文件10/11/20227基本原理B-樹(shù)與B+-樹(shù)索引結(jié)構(gòu)B-樹(shù)與B+-樹(shù)是樹(shù)形數(shù)據(jù)結(jié)構(gòu)的特例;B-樹(shù)最早是由R.Bayer和E.Mccreight兩人提出;B-樹(shù)的特點(diǎn)是:高效、易變、平衡以及獨(dú)立于硬件結(jié)構(gòu)等等;B-樹(shù)是目前數(shù)據(jù)庫(kù)管理系統(tǒng)中最重要的動(dòng)態(tài)文件索引結(jié)構(gòu);10/15/20228基本原理B-樹(shù)與B+-樹(shù)索引結(jié)構(gòu)10/11/20228B-樹(shù)與B+-樹(shù)索引結(jié)構(gòu)B+-樹(shù)是B-樹(shù)的改進(jìn):在B-樹(shù)中,指向數(shù)據(jù)的指針可以出現(xiàn)在
4、B-樹(shù)的任何一級(jí)在B+-樹(shù)中,數(shù)據(jù)指針只能出現(xiàn)在葉級(jí)結(jié)點(diǎn)B+-樹(shù)的葉級(jí)結(jié)點(diǎn)與中間級(jí)結(jié)點(diǎn)不同:對(duì)于每個(gè)索引碼值,B+-樹(shù)的葉級(jí)結(jié)點(diǎn)都要有一個(gè)對(duì)應(yīng)的索引項(xiàng),也稱(chēng)為索引記錄或索引行B+-樹(shù)葉級(jí)結(jié)點(diǎn)的索引項(xiàng)由兩部分組成,一部分是索引碼值,另一部分是索引碼值對(duì)應(yīng)的指針基本原理10/15/20229B-樹(shù)與B+-樹(shù)索引結(jié)構(gòu)基本原理10/11/20229B+-樹(shù)索引總體結(jié)構(gòu)B+-樹(shù)索引是一個(gè)多級(jí)索引,但是其結(jié)構(gòu)不同于多級(jí)順序索引B+-樹(shù)索引采用平衡樹(shù)結(jié)構(gòu),即每個(gè)葉結(jié)點(diǎn)到根的路徑長(zhǎng)度都相同每個(gè)非葉結(jié)點(diǎn)有n/2到n個(gè)子女,n對(duì)特定的樹(shù)是固定的基本原理10/15/202210B+-樹(shù)索引基本原理10/11/202
5、210B+-樹(shù)索引總體結(jié)構(gòu)B+-樹(shù)的所有結(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)都相同,它最多包含n-1個(gè)索引碼值K1、K2、Kn-1,以及n個(gè)指針P1、P2、Pn,每個(gè)結(jié)點(diǎn)中的索引碼值都按次序存放,即,如果ij,那么KiKj,如下圖所示:基本原理10/15/202211B+-樹(shù)索引基本原理10/11/202211B+-樹(shù)索引葉結(jié)點(diǎn)指針Pi(i=1,2,n-1)指向具有索引碼值為Ki的一個(gè)文件記錄或一個(gè)指針桶,桶中的每個(gè)指針指向具有索引碼值為Ki的一個(gè)文件記錄指針桶只在數(shù)據(jù)文件不按索引碼順序物理存儲(chǔ)記錄時(shí)才使用,指針Pn具有特殊的作用基本原理10/15/202212B+-樹(shù)索引基本原理10/11/202212B+-樹(shù)索
6、引葉結(jié)點(diǎn)每個(gè)葉結(jié)點(diǎn)最多可有n-1個(gè)索引碼值,最少也要有(n-1)/2個(gè)索引碼值各個(gè)葉結(jié)點(diǎn)中索引碼值的范圍互不相交要使B+-樹(shù)索引成為稠密索引,數(shù)據(jù)文件中的各個(gè)索引碼值就必須出現(xiàn)在某個(gè)葉結(jié)點(diǎn)中,且只能出現(xiàn)一次基本原理10/15/202213B+-樹(shù)索引基本原理10/11/202213B+-樹(shù)索引葉結(jié)點(diǎn)由于各個(gè)葉結(jié)點(diǎn)按照所含的索引碼值有一個(gè)線性順序,所以就可以利用各個(gè)葉結(jié)點(diǎn)的指針Pn將葉結(jié)點(diǎn)按索引碼順序鏈接在一起這種排序能夠高效地對(duì)文件進(jìn)行順序處理,而B(niǎo)+-樹(shù)索引的其他結(jié)構(gòu)能夠高效地對(duì)文件進(jìn)行隨機(jī)處理,如下圖所示 基本原理10/15/202214B+-樹(shù)索引基本原理10/11/202214B+-樹(shù)
7、索引葉結(jié)點(diǎn)基本原理10/15/202215B+-樹(shù)索引基本原理10/11/202215B+-樹(shù)索引非葉結(jié)點(diǎn)B+-樹(shù)索引的非葉結(jié)點(diǎn)形成葉結(jié)點(diǎn)上的一個(gè)多級(jí)(稀疏)索引非葉結(jié)點(diǎn)與葉結(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)相同,即都含有能夠存儲(chǔ)n-1個(gè)索引碼值和n個(gè)指針的存儲(chǔ)單元,只不過(guò)非葉結(jié)點(diǎn)中的所有指針都指向樹(shù)中的結(jié)點(diǎn)基本原理10/15/202216B+-樹(shù)索引基本原理10/11/202216B+-樹(shù)索引非葉結(jié)點(diǎn)如果一個(gè)非葉結(jié)點(diǎn)有m個(gè)指針,則n/2mn。若mn,則非葉結(jié)點(diǎn)中指針Pm之后的所有存儲(chǔ)空間作為預(yù)留空間,與葉結(jié)點(diǎn)的區(qū)別在于結(jié)點(diǎn)的最后一個(gè)指針Pm和Pn的位置與指向不同,如下圖所示基本原理10/15/202217B+-
8、樹(shù)索引基本原理10/11/202217B+-樹(shù)索引非葉結(jié)點(diǎn)在一個(gè)含有m個(gè)指針的非葉結(jié)點(diǎn)中,指針Pi(i=2,3,m-1)指向一棵子樹(shù),該子樹(shù)的所有結(jié)點(diǎn)的索引碼值大于等于Ki-1而小于Ki。指針Pm指向子樹(shù)中所含索引碼值大于等于Km-1的那一部分,而指針P1指向子樹(shù)中所含索引碼值小于K1的那一部分,如上圖所示基本原理IKk1Ki-1IKkiKm-1IK10/15/202218B+-樹(shù)索引基本原理IKk1Ki-1IKkiKm-1B+-樹(shù)索引根結(jié)點(diǎn)根結(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)也與葉結(jié)點(diǎn)相同根結(jié)點(diǎn)包含的指針數(shù)可以小于n/2,但是,除非整棵樹(shù)只有一個(gè)結(jié)點(diǎn),否則根結(jié)點(diǎn)必須至少包含兩個(gè)指針基本原理10/15/20221
9、9B+-樹(shù)索引基本原理10/11/202219B+-樹(shù)索引舉例:下面是一個(gè)B+-樹(shù)索引結(jié)構(gòu)的示意圖,其中n=3基本原理10/15/202220B+-樹(shù)索引基本原理10/11/202220利用B+-樹(shù)索引進(jìn)行查詢假設(shè)要找出索引碼值為K的所有記錄首先檢查根結(jié)點(diǎn),找到大于K的最小索引碼值,設(shè)是Ki,則沿著指針Pi走;如果KK1,那么沿著指針P1走;如果以上兩個(gè)條件都不滿足且KKm-1,m是該結(jié)點(diǎn)的指針數(shù),則沿著指針Pm走;對(duì)新到達(dá)的結(jié)點(diǎn),重復(fù)以上步驟,最終到達(dá)一個(gè)葉結(jié)點(diǎn)。基本原理10/15/202221利用B+-樹(shù)索引進(jìn)行查詢基本原理10/11/202221利用B+-樹(shù)索引進(jìn)行查詢舉例:基本原理10
10、/15/202222利用B+-樹(shù)索引進(jìn)行查詢基本原理10/11/202222簇集索引記錄的物理順序與索引碼順序一致簇集索引的葉級(jí)頁(yè)就是表的真正的數(shù)據(jù)頁(yè),而不僅僅是索引碼,同時(shí)也不需要數(shù)據(jù)指針。換句話說(shuō),數(shù)據(jù)本身成為簇集索引的一部分具有簇集索引的表的數(shù)據(jù)頁(yè),即葉級(jí)頁(yè),要鏈接成一個(gè)雙向鏈表,即頁(yè)鏈SQL Server的索引組織10/15/202223簇集索引SQL Server的索引組織10/11/20222簇集索引頁(yè)鏈中頁(yè)的邏輯順序以及數(shù)據(jù)頁(yè)上行的邏輯順序與索引碼的順序一致一個(gè)表只能有一個(gè)簇集索引,WHY?簇集索引都是唯一(UNIQUE)索引,即在索引的葉級(jí)不會(huì)有重復(fù)的索引碼值SQL Serve
11、r會(huì)根據(jù)需要給數(shù)據(jù)行增加一個(gè)唯一標(biāo)識(shí)符來(lái)保證索引的唯一性SQL Server的索引組織10/15/202224簇集索引SQL Server的索引組織10/11/20222非簇集索引樹(shù)的葉級(jí)頁(yè)里的每一個(gè)索引行包含一個(gè)標(biāo)簽(Bookmark)告訴SQL Server到哪兒去找對(duì)應(yīng)索引碼的數(shù)據(jù)行,標(biāo)簽一般有兩種形式:如果表有一個(gè)簇集索引,則標(biāo)簽就是對(duì)應(yīng)數(shù)據(jù)行的簇集索引碼如果表是一個(gè)堆,則標(biāo)簽就是行標(biāo)識(shí)符RID,即真正的行定位器-File#:Page#:Slot#SQL Server的索引組織10/15/202225非簇集索引SQL Server的索引組織10/11/2022非簇集索引非簇集索引不影響
12、表中數(shù)據(jù)頁(yè)的組織非簇集索引是完全獨(dú)立于表的數(shù)據(jù)結(jié)構(gòu),而簇集索引則是將索引結(jié)構(gòu)和表合二為一,所以一般建議在每個(gè)表上建一個(gè)簇集索引每個(gè)表可以有多個(gè)非簇集索引,最多可以有249個(gè)SQL Server的索引組織10/15/202226非簇集索引SQL Server的索引組織10/11/2022非簇集索引利用簇集索引進(jìn)行檢索最后得到的就是真正的數(shù)據(jù),而利用非簇集索引進(jìn)行檢索得到的是bookmark:簇集索引碼、RIDSQL Server的索引組織10/15/202227非簇集索引SQL Server的索引組織10/11/2022語(yǔ)法格式在SQL Server中創(chuàng)建索引10/15/202228語(yǔ)法格式在S
13、QL Server中創(chuàng)建索引10/11/2022主要參數(shù)說(shuō)明UNIQUE在表或視圖上創(chuàng)建一個(gè)唯一索引,唯一索引是指所有行的索引碼值都不相同的索引視圖上的簇集索引也必須是UNIQUE的在創(chuàng)建UNIQUE索引時(shí),多個(gè)NULL值被認(rèn)為是重復(fù)值在SQL Server中創(chuàng)建索引10/15/202229主要參數(shù)說(shuō)明在SQL Server中創(chuàng)建索引10/11/20主要參數(shù)說(shuō)明CLUSTERED在該參數(shù)約束下創(chuàng)建了一個(gè)對(duì)象,對(duì)象中行的物理順序與行的索引順序一致表或視圖只允許有一個(gè)簇集索引,擁有簇集索引的視圖叫做索引視圖,視圖上的唯一簇集索引必須在該視圖上定義任何其他索引之前創(chuàng)建在SQL Server中創(chuàng)建索引
14、10/15/202230主要參數(shù)說(shuō)明在SQL Server中創(chuàng)建索引10/11/20主要參數(shù)說(shuō)明CLUSTERED簇集索引最好也在建立任何非簇集索引之前創(chuàng)建。在表上創(chuàng)建簇集索引時(shí),該表已有的非簇集索引必須重構(gòu),因?yàn)榉谴丶饕~級(jí)包含的標(biāo)簽,以及簇集索引的唯一性可能引起數(shù)據(jù)行的變化如果沒(méi)有指定CLUSTERED關(guān)鍵詞,則被創(chuàng)建的索引就是非簇集索引在SQL Server中創(chuàng)建索引10/15/202231主要參數(shù)說(shuō)明在SQL Server中創(chuàng)建索引10/11/20主要參數(shù)說(shuō)明NONCLUSTERED在該參數(shù)約束下創(chuàng)建了一個(gè)對(duì)象,它指定了表中行的一種邏輯順序?qū)σ粋€(gè)非簇集索引來(lái)說(shuō),表中行的物理順序與它們
15、的索引順序無(wú)關(guān)在SQL Server中創(chuàng)建索引10/15/202232主要參數(shù)說(shuō)明在SQL Server中創(chuàng)建索引10/11/20主要參數(shù)說(shuō)明NONCLUSTERED非簇集索引的葉級(jí)包含索引行,每個(gè)索引行包含非簇集索引碼值及一個(gè)或多個(gè)標(biāo)簽,每個(gè)標(biāo)簽指向包含相應(yīng)非簇集索引碼值的數(shù)據(jù)行對(duì)視圖來(lái)說(shuō)只能在擁有簇集索引的視圖上創(chuàng)建非簇集索引,因此視圖上的非簇集索引的標(biāo)簽總是視圖行的簇集索引碼在SQL Server中創(chuàng)建索引10/15/202233主要參數(shù)說(shuō)明在SQL Server中創(chuàng)建索引10/11/20約束與索引當(dāng)聲明一個(gè)PRIMARY KEY或UNIQUE約束時(shí),SQL Server就在一個(gè)或多個(gè)列
16、上創(chuàng)建一個(gè)唯一(UNIQUE)索引,就好像是使用CREATE INDEX命令創(chuàng)建了索引一樣,而且這個(gè)索引是簇集的為支持這些約束而建構(gòu)的索引的名字與相應(yīng)約束的名字相同在SQL Server中創(chuàng)建索引10/15/202234約束與索引在SQL Server中創(chuàng)建索引10/11/202約束與索引就索引的內(nèi)部存儲(chǔ)與維護(hù)而言,用CREATE INDEX命令創(chuàng)建的唯一索引與為支持約束而創(chuàng)建的唯一索引沒(méi)有任何區(qū)別最大的區(qū)別就是刪除索引的方式不同:DROP INDEX命令只能刪除用CREATE INDEX命令創(chuàng)建的索引在SQL Server中創(chuàng)建索引10/15/202235約束與索引在SQL Server中創(chuàng)
17、建索引10/11/202索引頁(yè)與SQL Server的所有其他類(lèi)型的頁(yè)一樣,索引頁(yè)的大小也是固定的8KB,即8192字節(jié)和數(shù)據(jù)頁(yè)一樣:索引頁(yè)有一個(gè)96字節(jié)的頁(yè)頭;索引頁(yè)的尾部也有用來(lái)表示頁(yè)中行偏移的兩字節(jié)的行偏移數(shù)組。SQL Server的索引頁(yè)結(jié)構(gòu)10/15/202236索引頁(yè)SQL Server的索引頁(yè)結(jié)構(gòu)10/11/20223索引頁(yè)每個(gè)索引在sysindexes系統(tǒng)表中都有一行,該行的indid值為:1:表示簇集索引2到250:表示非簇集索引255:表示LOB數(shù)據(jù)SQL Server的索引頁(yè)結(jié)構(gòu)10/15/202237索引頁(yè)SQL Server的索引頁(yè)結(jié)構(gòu)10/11/20223索引頁(yè)索引
18、頁(yè)的頭信息與數(shù)據(jù)頁(yè)的頭信息幾乎完全一致唯一的區(qū)別就是type字段的值,type為1表示該頁(yè)為數(shù)據(jù)頁(yè),type為2表示該頁(yè)為索引頁(yè)索引頁(yè)頁(yè)頭的level字段和indexID字段的值都是非0的,而對(duì)數(shù)據(jù)頁(yè)來(lái)說(shuō),它們的值總是0SQL Server的索引頁(yè)結(jié)構(gòu)10/15/202238索引頁(yè)SQL Server的索引頁(yè)結(jié)構(gòu)10/11/20223索引頁(yè)在SQL Server中有三種基本類(lèi)型的索引頁(yè):非簇集索引的葉級(jí)頁(yè)非簇集索引的結(jié)點(diǎn)(非葉級(jí))頁(yè)(包括根)簇集索引的結(jié)點(diǎn)(非葉級(jí))頁(yè)(包括根)簇集索引的葉級(jí)頁(yè)并沒(méi)有一個(gè)真正單獨(dú)的結(jié)構(gòu),因?yàn)樗鼈兙褪菙?shù)據(jù)頁(yè)SQL Server的索引頁(yè)結(jié)構(gòu)10/15/202239索
19、引頁(yè)SQL Server的索引頁(yè)結(jié)構(gòu)10/11/20223具有唯一標(biāo)識(shí)符的簇集索引行如果在創(chuàng)建簇集索引時(shí)沒(méi)有指定選項(xiàng)UNIQUE,SQL Server會(huì)在必要的時(shí)候在數(shù)據(jù)行里增加一個(gè)4字節(jié)的字段使得每一個(gè)索引碼都唯一的這個(gè)必要的時(shí)候就是重復(fù)的索引碼被增加到表里時(shí):Create unique clustered:有和沒(méi)有unique的區(qū)別是什么?SQL Server的索引頁(yè)結(jié)構(gòu)10/15/202240具有唯一標(biāo)識(shí)符的簇集索引行SQL Server的索引頁(yè)結(jié)構(gòu)1具有唯一標(biāo)識(shí)符的簇集索引行舉例:創(chuàng)建一個(gè)不唯一的簇集索引建表及索引SQL Server的索引頁(yè)結(jié)構(gòu)10/15/202241具有唯一標(biāo)識(shí)符的
20、簇集索引行SQL Server的索引頁(yè)結(jié)構(gòu)1具有唯一標(biāo)識(shí)符的簇集索引行舉例:創(chuàng)建一個(gè)不唯一的簇集索引插入第一行數(shù)據(jù)SQL Server的索引頁(yè)結(jié)構(gòu)10/15/202242具有唯一標(biāo)識(shí)符的簇集索引行SQL Server的索引頁(yè)結(jié)構(gòu)1具有唯一標(biāo)識(shí)符的簇集索引行舉例:創(chuàng)建一個(gè)不唯一的簇集索引表中數(shù)據(jù)行的內(nèi)容SQL Server的索引頁(yè)結(jié)構(gòu)10/15/202243具有唯一標(biāo)識(shí)符的簇集索引行SQL Server的索引頁(yè)結(jié)構(gòu)1具有唯一標(biāo)識(shí)符的簇集索引行舉例:創(chuàng)建一個(gè)不唯一的簇集索引往表中插入簇集索引碼重復(fù)的數(shù)據(jù)SQL Server的索引頁(yè)結(jié)構(gòu)10/15/202244具有唯一標(biāo)識(shí)符的簇集索引行SQL Ser
21、ver的索引頁(yè)結(jié)構(gòu)1具有唯一標(biāo)識(shí)符的簇集索引行舉例:創(chuàng)建一個(gè)不唯一的簇集索引SQL Server的索引頁(yè)結(jié)構(gòu)10/15/202245具有唯一標(biāo)識(shí)符的簇集索引行SQL Server的索引頁(yè)結(jié)構(gòu)1具有唯一標(biāo)識(shí)符的簇集索引行舉例:創(chuàng)建一個(gè)不唯一的簇集索引具有重復(fù)簇集索引碼的數(shù)據(jù)行內(nèi)容Slot 0與Slot 1、2不同Slot 1、2有變長(zhǎng)列Slot 1、2中變長(zhǎng)列的內(nèi)容就是真正的4字節(jié)的唯一標(biāo)識(shí)符SQL Server的索引頁(yè)結(jié)構(gòu)10/15/202246具有唯一標(biāo)識(shí)符的簇集索引行SQL Server的索引頁(yè)結(jié)構(gòu)1索引行格式索引行與數(shù)據(jù)行的結(jié)構(gòu)非常相似,在索引行里沒(méi)有TagB和Fsize字段Fsize原
22、本表示行的定長(zhǎng)部分在什么位置結(jié)束,而在索引行里取而代之的是頁(yè)頭的pminlen值。pminlen值表示行的定長(zhǎng)部分的結(jié)束位置在行中的偏移量。如果索引行沒(méi)有變長(zhǎng)列和空值列,則pminlen就是行尾的偏移量SQL Server的索引頁(yè)結(jié)構(gòu)10/15/202247索引行格式SQL Server的索引頁(yè)結(jié)構(gòu)10/11/202索引行格式只有當(dāng)索引行有在定義時(shí)允許為空值的列時(shí),Ncol字段和Nullbits字段,即空值位圖,才會(huì)同時(shí)出現(xiàn)Ncol字段的值表示索引行里有多少列。而在數(shù)據(jù)行里,不管任意一列是否允許為空,數(shù)據(jù)行都一定要有Ncol字段和Nullbits字段SQL Server的索引頁(yè)結(jié)構(gòu)10/15/
23、202248索引行格式SQL Server的索引頁(yè)結(jié)構(gòu)10/11/202索引行格式SQL Server的索引頁(yè)結(jié)構(gòu)10/15/202249索引行格式SQL Server的索引頁(yè)結(jié)構(gòu)10/11/202索引行格式根據(jù)索引行在索引中的級(jí)別,它所包含的數(shù)據(jù)內(nèi)容會(huì)有所不同除了那些葉級(jí)的索引行,所有的索引行都包含一個(gè)6字節(jié)的下頁(yè)指針,索引碼值和標(biāo)簽除外下頁(yè)指針是非葉級(jí)索引行的定長(zhǎng)數(shù)據(jù)部分的最后一列SQL Server的索引頁(yè)結(jié)構(gòu)10/15/202250索引行格式SQL Server的索引頁(yè)結(jié)構(gòu)10/11/202索引行格式在非簇集索引中,把非簇集索引碼和標(biāo)簽當(dāng)作索引行的正常列看待根據(jù)每個(gè)碼列是如何定義的,非
24、簇集索引碼和標(biāo)簽可以處于索引行的固定部分或可變部分如果一個(gè)標(biāo)簽就是RID,無(wú)論如何,它總是索引行定長(zhǎng)數(shù)據(jù)的一部分SQL Server的索引頁(yè)結(jié)構(gòu)10/15/202251索引行格式SQL Server的索引頁(yè)結(jié)構(gòu)10/11/202索引行格式如果標(biāo)簽是一個(gè)簇集索引碼值,且簇集索引和非簇集索引共享了某些列,則真正的數(shù)據(jù)在索引行里只存儲(chǔ)一次例如,假設(shè)某表有一個(gè)簇集索引,而且簇集索引碼是lastname列,同時(shí)該表在firstname和lastname列上還有一個(gè)非簇集索引,則非簇集索引的索引行不會(huì)存儲(chǔ)lastname的值兩次SQL Server的索引頁(yè)結(jié)構(gòu)10/15/202252索引行格式SQL Se
25、rver的索引頁(yè)結(jié)構(gòu)10/11/202簇集索引的結(jié)點(diǎn)行簇集索引的結(jié)點(diǎn)行包含一個(gè)指向下一級(jí)索引頁(yè)的指針,即下頁(yè)指針,及該指針?biāo)赶蝽?yè)的第一個(gè)索引碼值(最小)SQL Server的索引頁(yè)結(jié)構(gòu)10/15/202253簇集索引的結(jié)點(diǎn)行SQL Server的索引頁(yè)結(jié)構(gòu)10/11/簇集索引的結(jié)點(diǎn)行舉例:創(chuàng)建表及簇集索引SQL Server的索引頁(yè)結(jié)構(gòu)10/15/202254簇集索引的結(jié)點(diǎn)行SQL Server的索引頁(yè)結(jié)構(gòu)10/11/簇集索引的結(jié)點(diǎn)行舉例:往表里插入大量數(shù)據(jù)SQL Server的索引頁(yè)結(jié)構(gòu)10/15/202255簇集索引的結(jié)點(diǎn)行SQL Server的索引頁(yè)結(jié)構(gòu)10/11/簇集索引的結(jié)點(diǎn)行舉例
26、:索引的根頁(yè):PAGE158分配給該表的第一個(gè)數(shù)據(jù)頁(yè):PAGE160。第一個(gè)的含義是首次分配給該表的數(shù)據(jù)頁(yè),也是分配給該表的所有數(shù)據(jù)頁(yè)的頁(yè)號(hào)從小到大排列時(shí)的位置而該表的第一條記錄-1250-最終被插入在數(shù)據(jù)頁(yè):PAGE740SQL Server的索引頁(yè)結(jié)構(gòu)10/15/202256簇集索引的結(jié)點(diǎn)行SQL Server的索引頁(yè)結(jié)構(gòu)10/11/簇集索引的結(jié)點(diǎn)行舉例:SQL Server的索引頁(yè)結(jié)構(gòu)下頁(yè)指針列10/15/202257簇集索引的結(jié)點(diǎn)行SQL Server的索引頁(yè)結(jié)構(gòu)下頁(yè)指針列1簇集索引的結(jié)點(diǎn)行舉例:下一級(jí)索引頁(yè):PAGE729SQL Server的索引頁(yè)結(jié)構(gòu)10/15/202258簇集索
27、引的結(jié)點(diǎn)行SQL Server的索引頁(yè)結(jié)構(gòu)10/11/簇集索引的結(jié)點(diǎn)行舉例:頁(yè)729(索引的中間級(jí)頁(yè))的第一行,即Slot 0的索引碼值是無(wú)意義的,但是下頁(yè)指針應(yīng)當(dāng)指向簇集索引的葉級(jí)頁(yè),而且應(yīng)當(dāng)是簇集索引碼順序下的第一個(gè)數(shù)據(jù)頁(yè)。表示下頁(yè)指針的16進(jìn)制數(shù)0 x02e3就是10進(jìn)制數(shù)的739。頁(yè)739是一個(gè)葉級(jí)頁(yè),它具有普通數(shù)據(jù)頁(yè)的頁(yè)結(jié)構(gòu)SQL Server的索引頁(yè)結(jié)構(gòu)10/15/202259簇集索引的結(jié)點(diǎn)行SQL Server的索引頁(yè)結(jié)構(gòu)10/11/簇集索引的結(jié)點(diǎn)行舉例:簇集索引碼順序下的第一個(gè)數(shù)據(jù)頁(yè),即頁(yè)739的第一條記錄的String1列的列值為10000索引列String1的數(shù)據(jù)類(lèi)型是ch
28、ar(5),本例插入的第一個(gè)數(shù)據(jù)是1250,但將其轉(zhuǎn)換成char(5)后就是1250(表示空格,其ASCII碼值是20)。當(dāng)按字母順序排列時(shí),10000排在1250的前面SQL Server的索引頁(yè)結(jié)構(gòu)10/15/202260簇集索引的結(jié)點(diǎn)行SQL Server的索引頁(yè)結(jié)構(gòu)10/11/簇集索引的結(jié)點(diǎn)行為什么“除了葉級(jí)頁(yè)以外,每個(gè)索引頁(yè)的第一個(gè)索引碼項(xiàng),即索引頁(yè)中Slot0的索引碼項(xiàng)常常是空或無(wú)意義”?根據(jù)B+樹(shù)結(jié)點(diǎn)結(jié)構(gòu)的約定,指針Pi(i=2,3,n-1)指向一棵子樹(shù),該子樹(shù)的所有結(jié)點(diǎn)的索引碼值大于等于Ki-1而小于KiSQL Server的索引頁(yè)結(jié)構(gòu)10/15/202261簇集索引的結(jié)點(diǎn)行S
29、QL Server的索引頁(yè)結(jié)構(gòu)10/11/簇集索引的結(jié)點(diǎn)行為什么“除了葉級(jí)頁(yè)以外,每個(gè)索引頁(yè)的第一個(gè)索引碼項(xiàng),即索引頁(yè)中Slot0的索引碼項(xiàng)常常是空或無(wú)意義”?而在SQL Server的索引頁(yè)中,索引記錄主要由兩項(xiàng)組成:索引碼值K和下頁(yè)指針P,其中索引碼值K是下頁(yè)指針P所指向頁(yè)的索引碼值的最小值,即該頁(yè)的第一個(gè)索引碼值SQL Server的索引頁(yè)結(jié)構(gòu)10/15/202262簇集索引的結(jié)點(diǎn)行SQL Server的索引頁(yè)結(jié)構(gòu)10/11/簇集索引的結(jié)點(diǎn)行SQL Server的索引頁(yè)結(jié)構(gòu)10/15/202263簇集索引的結(jié)點(diǎn)行SQL Server的索引頁(yè)結(jié)構(gòu)10/11/簇集索引的結(jié)點(diǎn)行SQL Serv
30、er的索引頁(yè)結(jié)構(gòu)10/15/202264簇集索引的結(jié)點(diǎn)行SQL Server的索引頁(yè)結(jié)構(gòu)10/11/簇集索引的結(jié)點(diǎn)行為什么“索引頁(yè)中Slot 0的索引碼項(xiàng)常常是空或無(wú)意義”?SQL Server的索引頁(yè)結(jié)構(gòu)10/15/202265簇集索引的結(jié)點(diǎn)行SQL Server的索引頁(yè)結(jié)構(gòu)10/11/非簇集索引的葉級(jí)行一般來(lái)說(shuō),非簇集索引的葉級(jí)行包含每一個(gè)索引碼值和相應(yīng)的標(biāo)簽舉例1:建立在堆上的唯一非簇集索引SQL Server的索引頁(yè)結(jié)構(gòu)10/15/202266非簇集索引的葉級(jí)行SQL Server的索引頁(yè)結(jié)構(gòu)10/11非簇集索引的葉級(jí)行舉例1:建立在堆上的唯一非簇集索引葉級(jí)索引行的標(biāo)簽是RID,共8個(gè)
31、字節(jié)SQL Server的索引頁(yè)結(jié)構(gòu)RID列10/15/202267非簇集索引的葉級(jí)行SQL Server的索引頁(yè)結(jié)構(gòu)RID列1非簇集索引的葉級(jí)行舉例2:在建立非簇集索引之前,先在一個(gè)varchar列上建立一個(gè)簇集索引,以便非簇集索引的標(biāo)簽是簇集索引碼 SQL Server的索引頁(yè)結(jié)構(gòu)10/15/202268非簇集索引的葉級(jí)行SQL Server的索引頁(yè)結(jié)構(gòu)10/11非簇集索引的葉級(jí)行舉例2:因?yàn)榇丶饕a是可變長(zhǎng)的,所以索引行中有關(guān)簇集索引碼的信息位于列數(shù)和NULL位圖之后SQL Server的索引頁(yè)結(jié)構(gòu)10/15/202269非簇集索引的葉級(jí)行SQL Server的索引頁(yè)結(jié)構(gòu)10/11非簇
32、集索引的葉級(jí)行舉例3:建立在String1和String2上的復(fù)合非簇集索引以及建立在String2上的(部分重疊的)簇集索引SQL Server的索引頁(yè)結(jié)構(gòu)10/15/202270非簇集索引的葉級(jí)行SQL Server的索引頁(yè)結(jié)構(gòu)10/11非簇集索引的葉級(jí)行舉例3:SQL Server的索引頁(yè)結(jié)構(gòu)只有當(dāng)索引行有在定義時(shí)允許為空值的列時(shí),Ncol字段和Nullbits字段,即空值位圖,才會(huì)同時(shí)出現(xiàn)!10/15/202271非簇集索引的葉級(jí)行SQL Server的索引頁(yè)結(jié)構(gòu)只有當(dāng)索引非簇集索引的葉級(jí)行舉例3:列String2的值(在本例中是630)既是非簇集索引碼的一部分,同時(shí)又是標(biāo)簽雖然列St
33、ring2在這里扮演兩個(gè)角色,但它的值沒(méi)有重復(fù)存儲(chǔ)由于這是葉級(jí)行,沒(méi)有下頁(yè)指針,而且由于該非簇集索引建立在簇集表上,因此標(biāo)簽是簇集索引碼,而不是RIDSQL Server的索引頁(yè)結(jié)構(gòu)10/15/202272非簇集索引的葉級(jí)行SQL Server的索引頁(yè)結(jié)構(gòu)10/11非簇集索引的結(jié)點(diǎn)行非簇集索引的非葉級(jí)結(jié)點(diǎn)行只是用來(lái)幫助SQL Server向下遍歷較低級(jí)的索引頁(yè)如果非簇集索引是唯一的,其結(jié)點(diǎn)行就只需要包含非簇集索引碼和下頁(yè)指針;如果非簇集索引不是唯一的,則索引結(jié)點(diǎn)行除了包含索引碼值和下頁(yè)指針以外,還必須包含一個(gè)標(biāo)簽,WHY?SQL Server的索引頁(yè)結(jié)構(gòu)10/15/202273非簇集索引的結(jié)點(diǎn)
34、行SQL Server的索引頁(yè)結(jié)構(gòu)10/11非簇集索引的結(jié)點(diǎn)行舉例1SQL Server的索引頁(yè)結(jié)構(gòu)10/15/202274非簇集索引的結(jié)點(diǎn)行SQL Server的索引頁(yè)結(jié)構(gòu)10/11非簇集索引的結(jié)點(diǎn)行舉例1SET NOCOUNT ONGODECLARE k intSET k = 1250WHILE k 1GO輸出結(jié)果如下:SQL Server的索引頁(yè)結(jié)構(gòu)10/15/202276非簇集索引的結(jié)點(diǎn)行SQL Server的索引頁(yè)結(jié)構(gòu)10/11非簇集索引的結(jié)點(diǎn)行舉例1SQL Server的索引頁(yè)結(jié)構(gòu)下頁(yè)指針列10/15/202277非簇集索引的結(jié)點(diǎn)行SQL Server的索引頁(yè)結(jié)構(gòu)下頁(yè)指針列非簇集索
35、引的結(jié)點(diǎn)行舉例1:從創(chuàng)建索引行的目的來(lái)看,SQL Server并不關(guān)心在非唯一的非簇集索引中索引碼是否真的包含重復(fù)值。如果沒(méi)有將非簇集索引定義為唯一的(在CREATE INDEX語(yǔ)句中使用UNIQUE選項(xiàng)),即使所有的非簇集索引碼值都是唯一的,非葉級(jí)的索引行都將包含標(biāo)簽SQL Server的索引頁(yè)結(jié)構(gòu)10/15/202278非簇集索引的結(jié)點(diǎn)行SQL Server的索引頁(yè)結(jié)構(gòu)10/11非簇集索引的結(jié)點(diǎn)行舉例2SQL Server的索引頁(yè)結(jié)構(gòu)10/15/202279非簇集索引的結(jié)點(diǎn)行SQL Server的索引頁(yè)結(jié)構(gòu)10/11非簇集索引的結(jié)點(diǎn)行舉例2SET NOCOUNT ONGODECLARE k
36、 intSET k = 1250WHILE k 1GO輸出結(jié)果如下: SQL Server的索引頁(yè)結(jié)構(gòu)10/15/202281非簇集索引的結(jié)點(diǎn)行SQL Server的索引頁(yè)結(jié)構(gòu)10/11非簇集索引的結(jié)點(diǎn)行舉例2SQL Server的索引頁(yè)結(jié)構(gòu)在非簇集索引中,把非簇集索引碼和標(biāo)簽當(dāng)作索引行的正常列看待如果非簇集索引是唯一的,其結(jié)點(diǎn)行就只需要包含非簇集索引碼和下頁(yè)指針下頁(yè)指針列10/15/202282非簇集索引的結(jié)點(diǎn)行SQL Server的索引頁(yè)結(jié)構(gòu)在非簇集B樹(shù)的大小索引的大小,通常是指索引樹(shù)的大小簇集索引包括真正的數(shù)據(jù),即使你刪除了簇集索引,真正的數(shù)據(jù)仍然存在對(duì)非簇集索引來(lái)說(shuō),表中的每個(gè)數(shù)據(jù)行在
37、索引的葉級(jí)都要有一個(gè)索引行對(duì)簇集索引來(lái)說(shuō),表的每個(gè)數(shù)據(jù)頁(yè)在索引的非葉級(jí)都要有一個(gè)索引行索引的空間需求10/15/202283B樹(shù)的大小索引的空間需求10/11/202283B樹(shù)的大小對(duì)簇集索引來(lái)說(shuō),可以通過(guò)以下計(jì)算過(guò)程得到簇集索引的葉級(jí)之上的索引級(jí)需要多少索引頁(yè)索引頁(yè)填充因子,簡(jiǎn)稱(chēng) = 每頁(yè)可利用的字節(jié)數(shù)/索引行的大小1級(jí)索引頁(yè)的個(gè)數(shù) = 數(shù)據(jù)頁(yè)的個(gè)數(shù)/2級(jí)索引頁(yè)的個(gè)數(shù) = 1級(jí)索引頁(yè)的個(gè)數(shù)/索引的空間需求10/15/202284B樹(shù)的大小索引的空間需求10/11/202284B樹(shù)的大小對(duì)簇集索引來(lái)說(shuō),可以通過(guò)以下計(jì)算過(guò)程得到簇集索引的葉級(jí)之上的索引級(jí)需要多少索引頁(yè)3級(jí)索引頁(yè)的個(gè)數(shù) = 2級(jí)索
38、引頁(yè)的個(gè)數(shù)/一旦到了某一級(jí)后只需要一個(gè)索引頁(yè)就停止計(jì)算,這一頁(yè)就是簇集索引的根頁(yè)非簇集索引大小的計(jì)算過(guò)程與此類(lèi)似索引的空間需求10/15/202285B樹(shù)的大小索引的空間需求10/11/202285B樹(shù)的大小對(duì)簇集索引來(lái)說(shuō),10000頁(yè)的表大概需要16個(gè)索引頁(yè),索引的大小不到表的1%。因此常常以1%作為簇集索引空間需求的大致估計(jì)對(duì)非簇集索引來(lái)說(shuō),像簇集索引那樣給出一個(gè)好的大致估計(jì)很難。一般非簇集索引的大小可能是表大小的30%到40%,甚至有可能比表本身還要大索引的空間需求10/15/202286B樹(shù)的大小索引的空間需求10/11/202286索引的實(shí)際大小相對(duì)于前面剛剛描述的大致估計(jì),表或索引
39、真正使用空間的信息存儲(chǔ)在sysindexes系統(tǒng)表里sysindexes表里的rowcnt列包含了相應(yīng)表中數(shù)據(jù)行的數(shù)目對(duì)簇集索引或堆來(lái)說(shuō),sysindexes表里的dpages列包含了已使用的數(shù)據(jù)頁(yè)數(shù)目,而對(duì)其他所有索引來(lái)說(shuō),dpages列包含了已使用的索引頁(yè)的數(shù)目索引的空間需求10/15/202287索引的實(shí)際大小索引的空間需求10/11/202287索引碎片的類(lèi)型SQL Server自動(dòng)維護(hù)索引,但隨著時(shí)間的推移,索引可能會(huì)變得越來(lái)越碎,索引碎片有兩類(lèi):內(nèi)部碎片:當(dāng)索引頁(yè)里還有空間可利用時(shí),也就是說(shuō)索引空間沒(méi)有充分利用的時(shí)候,就會(huì)出現(xiàn)內(nèi)部碎片外部碎片:當(dāng)頁(yè)的邏輯順序和物理順序不匹配的時(shí)候,
40、或者是當(dāng)屬于一個(gè)表的盤(pán)區(qū)不連續(xù)的時(shí)候,外部碎片就出現(xiàn)了索引的管理10/15/202288索引碎片的類(lèi)型索引的管理10/11/202288索引碎片的問(wèn)題內(nèi)部碎片內(nèi)部碎片影響索引的性能,但可以減少分裂頁(yè)的操作外部碎片只有當(dāng)SQL Server順序掃描表或索引的時(shí)候,外部碎片才真正有害索引的管理10/15/202289索引碎片的問(wèn)題索引的管理10/11/202289索引碎片的檢測(cè)索引的管理10/15/202290索引碎片的檢測(cè)索引的管理10/11/202290刪除索引碎片重建索引以便讓SQL Server分配新的連續(xù)頁(yè)使用DROP INDEX和CREATE INDEX命令使用DBCC DBREIND
41、EX命令,它能夠在一次操作里重建一個(gè)表上的所有索引使用具有drop_existing子句的CREATE INDEX命令索引的管理10/15/202291刪除索引碎片索引的管理10/11/202291刪除索引碎片重建索引的問(wèn)題當(dāng)索引支持約束的時(shí)候,不能使用DROP INDEX命令重建索引的時(shí)候表是不可用的如果正在重建非簇集索引, SQL Server就會(huì)給表加共享鎖,其他進(jìn)程可查詢但不能更新該表如果正在重建簇集索引,SQL Server就會(huì)給表加排他鎖,其他進(jìn)程根本不能訪問(wèn)該表索引的管理10/15/202292刪除索引碎片索引的管理10/11/202292刪除索引碎片SQL Server不用完全
42、重建索引也能夠整理索引的碎片DBCC INDEXDEFRAG命令可以整理索引的葉級(jí)頁(yè),以便它們的物理順序與葉級(jí)結(jié)點(diǎn)的邏輯順序相匹配,以提高索引掃描的性能DBCC INDEXDEFRAG命令的語(yǔ)法格式索引的管理10/15/202293刪除索引碎片索引的管理10/11/202293刪除索引碎片DBCC INDEXDEFRAG命令的語(yǔ)法格式索引的管理10/15/202294刪除索引碎片索引的管理10/11/202294SQL Server 2000有兩種特殊索引計(jì)算列上的索引和視圖上的索引如果沒(méi)有索引,這兩中結(jié)構(gòu)都是純邏輯的,不涉及數(shù)據(jù)的物理存儲(chǔ),而只保存相關(guān)的計(jì)算公式和SELECT語(yǔ)句有了這些特殊
43、索引之后,SQL Server就將那些邏輯數(shù)據(jù)真正實(shí)體化成索引的物理葉級(jí)。因此,建立在計(jì)算列上和視圖上的第一個(gè)索引必須是簇集的SQL Server的特殊索引10/15/202295SQL Server 2000有兩種特殊索引SQL Serv往堆里插入新行如果表沒(méi)有簇集索引,即表是一個(gè)堆,則新行總是插入到表中有可用空間的地方利用IAM頁(yè)和PFS頁(yè),SQL Server就可以知道文件的哪些盤(pán)區(qū)已經(jīng)屬于該表以及在哪些盤(pán)區(qū)中哪些頁(yè)有空間可利用如果沒(méi)有頁(yè)有空間可利用,SQL Server就必須給表分配一個(gè)全新的盤(pán)區(qū)。利用GAM頁(yè)和SGAM頁(yè),SQL Server就可以找到可分配給一個(gè)對(duì)象的盤(pán)區(qū)(前8頁(yè)來(lái)
44、自混合盤(pán)區(qū))插入行10/15/202296往堆里插入新行插入行10/11/202296往具有簇集索引的表里插入新行什么是新行?新行可以是INSERT語(yǔ)句的直接結(jié)果也可以是UPDATE語(yǔ)句的結(jié)果,當(dāng)然這個(gè)UPDATE語(yǔ)句是按照先刪除后插入的策略執(zhí)行的,即將UPDATE語(yǔ)句分解為DELETE后跟INSERT語(yǔ)句新行的簇集索引碼列的值指導(dǎo)新行被插入到特定的頁(yè),即新行的簇集位置插入行10/15/202297往具有簇集索引的表里插入新行插入行10/11/202297往具有簇集索引的表里插入新行新行的簇集位置如果簇集位置的當(dāng)前頁(yè)沒(méi)有空間,通過(guò)頁(yè)分裂將新行插入到頁(yè)的銜接處頁(yè)分裂要求SQL Server必須分
45、配新頁(yè)并將新頁(yè)鏈接到頁(yè)鏈中如果可能,這個(gè)新頁(yè)是從與其他頁(yè)相同的盤(pán)區(qū),即已有的盤(pán)區(qū)分配來(lái)的如果所有的盤(pán)區(qū)都是滿的,新的盤(pán)區(qū)就要分配給這個(gè)表插入行10/15/202298往具有簇集索引的表里插入新行插入行10/11/202298往具有簇集索引的表里插入新行如果簇集索引沒(méi)有被聲明為UNIQUE的,而插入的新行里又有重復(fù)的索引碼值,那么一個(gè)唯一標(biāo)識(shí)符就會(huì)為具有相同索引碼值的所有后續(xù)行自動(dòng)生成,因?yàn)镾QL Server要求所有的簇集索引都是唯一的!插入行10/15/202299往具有簇集索引的表里插入新行插入行10/11/202299頁(yè)分裂及其類(lèi)型SQL Server找到新頁(yè)之后,原始頁(yè)里的數(shù)據(jù)就必須一
46、分為二:原始頁(yè)只留下一半數(shù)據(jù),而另一半數(shù)據(jù)移動(dòng)到新頁(yè)里,這就是所謂的頁(yè)分裂有時(shí),SQL Server發(fā)現(xiàn)即使在分裂頁(yè)之后,新行也沒(méi)有足夠的存儲(chǔ)空間可利用,這可能是由于新行的變長(zhǎng)字段的值所占用的字節(jié)非常多而造成的分裂頁(yè)10/15/2022100頁(yè)分裂及其類(lèi)型分裂頁(yè)10/11/2022100頁(yè)分裂及其類(lèi)型在SQL Server中,頁(yè)分裂的類(lèi)型依賴于被分裂的頁(yè)的類(lèi)型,被分裂的頁(yè)可能是:索引的根頁(yè)索引的中間頁(yè)數(shù)據(jù)頁(yè),也是簇集索引的葉級(jí)頁(yè);而非簇集索引的葉級(jí)頁(yè)分裂時(shí)按照索引的中間頁(yè)來(lái)對(duì)待分裂頁(yè)10/15/2022101頁(yè)分裂及其類(lèi)型分裂頁(yè)10/11/2022101分裂索引的根頁(yè)如果為了插入一個(gè)新的索引行
47、而必須分裂索引的根頁(yè),則步驟如下:要有兩個(gè)新頁(yè)被分配給該索引來(lái)自根頁(yè)的所有索引行被分割到這兩個(gè)新頁(yè)里新的索引行則被插入到這兩個(gè)新頁(yè)之一的適當(dāng)位置原始的根頁(yè)仍然是分裂后的根頁(yè),只不過(guò)它現(xiàn)在只有兩個(gè)新增加的索引行,分別指向剛剛分配過(guò)來(lái)的新頁(yè)(前面的first與root值相同)分裂頁(yè)10/15/2022102分裂索引的根頁(yè)分裂頁(yè)10/11/2022102分裂索引的根頁(yè)根頁(yè)的分裂造成索引級(jí)別的增加,由于索引的級(jí)別通常不會(huì)很多,所以這種類(lèi)型的分裂不會(huì)經(jīng)常發(fā)生分裂頁(yè)10/15/2022103分裂索引的根頁(yè)分裂頁(yè)10/11/2022103分裂索引的中間頁(yè)通過(guò)以下步驟就可以簡(jiǎn)單地實(shí)現(xiàn)索引中間頁(yè)的分裂:首先確定
48、被分裂頁(yè)上的索引碼的中間點(diǎn)接著分配一個(gè)新頁(yè)然后將舊索引頁(yè)上中間點(diǎn)下游的索引行拷貝到新頁(yè)中這種頁(yè)分裂比根頁(yè)的分裂普遍一些,但也不是經(jīng)常發(fā)生分裂頁(yè)10/15/2022104分裂索引的中間頁(yè)分裂頁(yè)10/11/2022104分裂數(shù)據(jù)頁(yè)數(shù)據(jù)頁(yè)的分裂是最有趣的、而且也是最普遍的頁(yè)分裂只有在插入操作中,而且只有當(dāng)被插入數(shù)據(jù)的表上存在簇集索引時(shí),數(shù)據(jù)頁(yè)的分裂才可能發(fā)生如果表上沒(méi)有簇集索引,新數(shù)據(jù)行可以插入到任何一頁(yè),只要SQL Server根據(jù)PFS頁(yè)判斷該頁(yè)有空間就可以分裂頁(yè)10/15/2022105分裂數(shù)據(jù)頁(yè)分裂頁(yè)10/11/2022105分裂數(shù)據(jù)頁(yè)雖然數(shù)據(jù)頁(yè)的分裂只能由插入操作引起,但該插入操作可以是U
49、PDATE語(yǔ)句的結(jié)果,而不僅僅是INSERT語(yǔ)句的結(jié)果如果數(shù)據(jù)行不能在它所在的位置被更新,或者至少是不能在同一頁(yè)被更新,則更新操作就要變成一個(gè)刪除操作和一個(gè)插入操作,而后面這個(gè)插入操作就可能引起數(shù)據(jù)頁(yè)的分裂分裂頁(yè)10/15/2022106分裂數(shù)據(jù)頁(yè)分裂頁(yè)10/11/2022106分裂數(shù)據(jù)頁(yè)和索引中間頁(yè)的分裂一樣,數(shù)據(jù)頁(yè)的分裂也要經(jīng)過(guò)三個(gè)步驟:首先確定要被分裂的數(shù)據(jù)頁(yè)上的索引碼的中間點(diǎn)接著分配一個(gè)新數(shù)據(jù)頁(yè)然后將舊數(shù)據(jù)頁(yè)上中間點(diǎn)下游的數(shù)據(jù)行拷貝到新頁(yè)中典型的頁(yè)分裂的代價(jià)不是很昂貴分裂頁(yè)10/15/2022107分裂數(shù)據(jù)頁(yè)分裂頁(yè)10/11/2022107分裂數(shù)據(jù)頁(yè)數(shù)據(jù)頁(yè)的分裂不僅需要索引管理器確定新
50、數(shù)據(jù)行應(yīng)該位于的頁(yè),而且還要處理那些不適合在舊頁(yè)和新頁(yè)存儲(chǔ)的大數(shù)據(jù)行當(dāng)數(shù)據(jù)頁(yè)被分裂時(shí),如果簇集索引碼值沒(méi)有改變,那么非簇集索引不會(huì)受到任何影響分裂頁(yè)10/15/2022108分裂數(shù)據(jù)頁(yè)分裂頁(yè)10/11/2022108一個(gè)具有簇集索引的表的數(shù)據(jù)插入過(guò)程頁(yè)分裂舉例10/15/2022109一個(gè)具有簇集索引的表的數(shù)據(jù)插入過(guò)程頁(yè)分裂舉例10/11/20概述當(dāng)從表中刪除行時(shí),必須考慮數(shù)據(jù)頁(yè)和索引頁(yè)都發(fā)生了什么變化?簇集索引的葉級(jí)頁(yè)就是真正的數(shù)據(jù)頁(yè),從擁有簇集索引的表中刪除一行數(shù)據(jù)和從非簇集索引的葉級(jí)頁(yè)刪除一行索引的行為是一樣的從堆中刪除數(shù)據(jù)行的行為與上述情況完全不一樣,它類(lèi)似于從索引的中間結(jié)點(diǎn)頁(yè)里刪除索
51、引行刪除行10/15/2022110概述刪除行10/11/2022110從堆中刪除數(shù)據(jù)行當(dāng)一行數(shù)據(jù)要從堆中被刪除時(shí),SQL Server 2000不會(huì)自動(dòng)壓縮空間如果要?jiǎng)h除的數(shù)據(jù)行位于某頁(yè)的slot x處,則SQL Server僅將slot x的行偏移數(shù)組的偏移量改為0(TagA),而頁(yè)里其他slot的數(shù)據(jù)不發(fā)生任何變化,也不移動(dòng)作為性能優(yōu)化,直到一頁(yè)需要額外的連續(xù)空間插入新行時(shí),壓縮才會(huì)發(fā)生刪除行10/15/2022111從堆中刪除數(shù)據(jù)行刪除行10/11/2022111從B-樹(shù)中刪除葉級(jí)行在索引的葉級(jí),當(dāng)行被刪除時(shí),它們就成為幽靈記錄。也就是說(shuō)被刪除的行還繼續(xù)保留在頁(yè)上,但是行頭有一位被修改
52、,以表示該行確實(shí)被刪除而成為幽靈了被刪除行所在頁(yè)的頁(yè)頭也有反映幽靈記錄個(gè)數(shù)的信息,幽靈記錄主要用于碼-范圍(key-range)加鎖的并發(fā)優(yōu)化刪除行10/15/2022112從B-樹(shù)中刪除葉級(jí)行刪除行10/11/2022112從B-樹(shù)中刪除葉級(jí)行幽靈記錄只能出現(xiàn)在索引的葉級(jí)結(jié)點(diǎn)(簇集與非簇集索引)。如果不用幽靈記錄,包圍被刪除碼的整個(gè)范圍將不得不加鎖假如在整數(shù)列上有一個(gè)唯一索引,并且索引包含值1、30和100。如果刪除碼值為30的行,SQL Server就需要對(duì)1到100整個(gè)范圍進(jìn)行加鎖如果使用幽靈記錄,30作為碼-范圍鎖的一個(gè)端點(diǎn)仍是可見(jiàn)的,以便在刪除事務(wù)執(zhí)行期間,SQL Server仍允許
53、任何碼值不是30的插入操作繼續(xù)進(jìn)行刪除行10/15/2022113從B-樹(shù)中刪除葉級(jí)行刪除行10/11/2022113從B-樹(shù)中刪除葉級(jí)行SQL Server提供了一個(gè)特殊的內(nèi)務(wù)處理線程來(lái)周期地檢查B-樹(shù)的幽靈記錄,并且異步地將它們從索引的葉級(jí)移走。如果你設(shè)置了相應(yīng)的選項(xiàng),這個(gè)線程還執(zhí)行數(shù)據(jù)庫(kù)的自動(dòng)壓縮任務(wù)刪除行10/15/2022114從B-樹(shù)中刪除葉級(jí)行刪除行10/11/2022114從索引的中間結(jié)點(diǎn)刪除行當(dāng)從表中刪除數(shù)據(jù)行時(shí),所有的非簇集索引都需要維護(hù),因?yàn)槊恳粋€(gè)非簇集索引在葉級(jí)都要有一個(gè)指針指向剛被刪除的數(shù)據(jù)行當(dāng)索引的中間結(jié)點(diǎn)頁(yè)里的行被刪除時(shí),它不能是幽靈的,但是,可以像處理堆頁(yè)那樣,
54、先不著急壓縮空間,當(dāng)新的索引行需要空間時(shí)再壓縮該頁(yè)刪除行10/15/2022115從索引的中間結(jié)點(diǎn)刪除行刪除行10/11/2022115回收頁(yè)當(dāng)數(shù)據(jù)頁(yè)的最后一行被刪除時(shí),整個(gè)頁(yè)就被解除分配。如果該頁(yè)是整個(gè)表僅有的一頁(yè),那么它不會(huì)被解除分配。因?yàn)槊總€(gè)表至少要包含一頁(yè),即使它是空的也沒(méi)有關(guān)系。這與一個(gè)表剛被創(chuàng)建時(shí)不會(huì)立即為其分配任何存儲(chǔ)空間不一樣!刪除行10/15/2022116回收頁(yè)刪除行10/11/2022116回收頁(yè)從數(shù)據(jù)頁(yè)里刪除行也會(huì)導(dǎo)致指向該數(shù)據(jù)頁(yè)的索引頁(yè)里索引行的刪除。如果索引行被刪除,在索引頁(yè)里只留下最后一條索引記錄,那么該索引頁(yè)也會(huì)被解除分配。為什么呢?因?yàn)樵攘粼谒饕?yè)里的最后一
55、條索引記錄被移動(dòng)到與該索引頁(yè)相鄰的頁(yè)里,這樣就可以把空的索引頁(yè)解除分配。刪除行10/15/2022117回收頁(yè)刪除行10/11/2022117更新策略延遲更新使用事務(wù)日志作為中間的緩沖區(qū),將更新操作分兩遍完成,它是更新策略中最慢的一種策略SQL Server 2000不支持延遲更新,所有的更新操作都是直接完成的,即直接更新,它不需要使用事務(wù)日志作為中間的緩沖區(qū)更新行10/15/2022118更新策略更新行10/11/2022118更新操作的分類(lèi)在執(zhí)行更新操作之前,SQL Server要評(píng)估更新操作要影響多少行,如何訪問(wèn)這些行以及是否有索引碼的改變要發(fā)生等等。更新操作可分為:在位更新:更新操作在
56、通常的位置進(jìn)行異位更新:更新操作不在通常的位置進(jìn)行,而變成先刪除后插入兩個(gè)操作,這就要引起數(shù)據(jù)行的移動(dòng)更新行10/15/2022119更新操作的分類(lèi)更新行10/11/2022119移動(dòng)數(shù)據(jù)行在SQL Server 2000中,什么情況下會(huì)發(fā)生數(shù)據(jù)行的移動(dòng)呢?一是數(shù)據(jù)行的變長(zhǎng)列被更新變大,它不再適合放在原來(lái)的位置上二是數(shù)據(jù)行的簇集索引列發(fā)生了改變,該數(shù)據(jù)行需要移動(dòng)到別的數(shù)據(jù)頁(yè)里,因?yàn)閿?shù)據(jù)行是按照簇集索引碼的順序物理存儲(chǔ)的更新行10/15/2022120移動(dòng)數(shù)據(jù)行更新行10/11/2022120數(shù)據(jù)行移動(dòng)與非簇集索引非簇集索引的葉級(jí)包含表中每一數(shù)據(jù)行的標(biāo)簽如果表有一個(gè)簇集索引,標(biāo)簽就是行的簇集索引碼:當(dāng)且僅當(dāng)簇集索引碼發(fā)生了改變,每個(gè)非簇集索引的更新才是必要的如果一個(gè)數(shù)據(jù)行不再適合存儲(chǔ)在原來(lái)的頁(yè)上而要移到別處,但是該行的簇集索引碼沒(méi)有改變,所有的
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度跨境電商平臺(tái)運(yùn)營(yíng)與推廣服務(wù)合同2篇
- 2025年度玻璃隔斷安裝工程合同糾紛處理與爭(zhēng)議解決合同2篇
- 二零二五版二手房買(mǎi)賣(mài)合同范本(含按揭貸款及裝修款支付)3篇
- 二零二五版家政服務(wù)人員勞動(dòng)保障合同范本3篇
- 2024碎石原料交易平臺(tái)運(yùn)營(yíng)合同
- 中介公司月嫂服務(wù)協(xié)議標(biāo)準(zhǔn)版2024版A版
- 4S店租賃新規(guī):2024版汽車(chē)租賃協(xié)議一
- 2024教育培訓(xùn)勞務(wù)承包合同
- 天津工業(yè)職業(yè)學(xué)院《無(wú)機(jī)化學(xué)(4)》2023-2024學(xué)年第一學(xué)期期末試卷
- 二零二五年礦山爆破作業(yè)承包合同3篇
- (3.10)-心悸急診醫(yī)學(xué)急診醫(yī)學(xué)
- 不動(dòng)產(chǎn)登記操作規(guī)范解讀
- 蓋洛普Q12解讀和實(shí)施完整版
- 2023年Web前端技術(shù)試題
- GB/T 20840.8-2007互感器第8部分:電子式電流互感器
- GB/T 14864-2013實(shí)心聚乙烯絕緣柔軟射頻電纜
- 信息學(xué)奧賽-計(jì)算機(jī)基礎(chǔ)知識(shí)(完整版)資料
- 發(fā)煙硫酸(CAS:8014-95-7)理化性質(zhì)及危險(xiǎn)特性表
- 數(shù)字信號(hào)處理(課件)
- 公路自然災(zāi)害防治對(duì)策課件
- 耳鳴中醫(yī)臨床路徑
評(píng)論
0/150
提交評(píng)論