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

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

Sql Server之旅——第十站 看看DML操作對索引的影響

2024-08-31 00:54:49
字體:
來源:轉載
供稿:網友
Sql Server之旅——第十站 看看DML操作對索引的影響

  我們都知道建索引是需要謹慎的,當只有利大于弊的時候才適合建,我們也知道建索引是需要維護成本的,這個維護也就在于DML操作了,

下面我們具體看看到底DML對索引都有哪些內幕。。。。

一:delete操作

  現在我們已經知道,索引都是以B樹的形式存在的,既然是B樹,我們就要看看他們的葉子節點和分支結點,先準備點測試數據,如下圖:

CREATE TABLE Person(ID INT,NAME CHAR(200))CREATE INDEX idx_Name ON Person(NAME)DECLARE @ch AS INT=65WHILE @ch<=122BEGIN    INSERT INTO dbo.Person(ID,NAME)    VALUES    (      @ch,      REPLICATE(CHAR(@ch),200)    )    SET @ch=@ch+1END

<1> 葉子結點的變化

  從上面的圖中大概可以看到,當我插入完畢后,現在有4個索引數據頁,其中PID=200的為分支數據頁,其他三個為葉子節點數據頁,分別

為175,201,202號數據頁,然后我就挑選第二個葉子節點數據頁201號,看看里面的數據是啥樣的。

從數據頁中可以看到在201號數據頁中有18個槽位,當然除了通過槽位看記錄條數之外,你還可以通過Pageheader中的m_slotCnt來觀察記

錄個數,如下圖:

接下來,我們看看slot0槽位的內容是啥樣,如下圖:

 1 0000000000000000:   16484848 48484848 48484848 48484848 †.HHHHHHHHHHHHHHH  2 0000000000000010:   48484848 48484848 48484848 48484848 †HHHHHHHHHHHHHHHH  3 0000000000000020:   48484848 48484848 48484848 48484848 †HHHHHHHHHHHHHHHH  4 0000000000000030:   48484848 48484848 48484848 48484848 †HHHHHHHHHHHHHHHH  5 0000000000000040:   48484848 48484848 48484848 48484848 †HHHHHHHHHHHHHHHH  6 0000000000000050:   48484848 48484848 48484848 48484848 †HHHHHHHHHHHHHHHH  7 0000000000000060:   48484848 48484848 48484848 48484848 †HHHHHHHHHHHHHHHH  8 0000000000000070:   48484848 48484848 48484848 48484848 †HHHHHHHHHHHHHHHH  9 0000000000000080:   48484848 48484848 48484848 48484848 †HHHHHHHHHHHHHHHH 10 0000000000000090:   48484848 48484848 48484848 48484848 †HHHHHHHHHHHHHHHH 11 00000000000000A0:   48484848 48484848 48484848 48484848 †HHHHHHHHHHHHHHHH 12 00000000000000B0:   48484848 48484848 48484848 48484848 †HHHHHHHHHHHHHHHH 13 00000000000000C0:   48484848 48484848 48970000 00010007 †HHHHHHHHH....... 14 00000000000000D0:   00020000 ††††††††††††††††††††††††††††....      

看到內容之后,我們把這條記錄刪掉,然后快速的觀察數據頁的變化,很有意思的。。。。如下圖:

仔細觀察上面的圖,你會看到m_slotCnt=18。。。。你也看到m_GhostRecCnt=1,看這個名字你就知道是“幻象”的意思。。。正因為被

標記為幻象,所以sqlserver的后臺進程會在某個時候把數據正真的刪除掉,比如你過個幾秒之后再查看就能看到真的被清除了。

<2> 分支節點的變化

  說完葉子節點,然后我們繼續看看分支節點,通過前面的博文,你應該知道在分支節點中是依次保存著排序后的每個葉子節點中的最小值,剛好

我刪除了第二個葉子節點的第一個值,那這個值也正好保存在分支節點中,那下面一個問題來了,我剛才刪除了ID=72的記錄,那這個ID=72的還會

在分支節點中保存嗎???不用太興奮,我們用數據來說說看,繼續查看200號數據頁。

二:insert操作

  我們知道索引都是按照索引列升序的,那當我insert的時候,是不是需要給我插入到排序的指定位置呢???比如說我剛才刪除的HHH。。。

數據,這次我再insert的時候,是不是需要給我插入到第二個數據頁的slot0位置呢???下面繼續用數據說話。

1 INSERT INTO dbo.Person VALUES(72,REPLICATE(CHAR(72),200))2 DBCC PAGE(Ctrip,1,201,1)
 1 Slot 0, Offset 0x101c, Length 212, DumpStyle BYTE 2  3 Record Type = INDEX_RECORD           Record Attributes =  NULL_BITMAP     Record Size = 212 4  5 Memory Dump @0x000000000FE5B01C 6  7 0000000000000000:   16686868 68686868 68686868 68686868 †.hhhhhhhhhhhhhhh  8 0000000000000010:   68686868 68686868 68686868 68686868 †hhhhhhhhhhhhhhhh  9 0000000000000020:   68686868 68686868 68686868 68686868 †hhhhhhhhhhhhhhhh 10 0000000000000030:   68686868 68686868 68686868 68686868 †hhhhhhhhhhhhhhhh 11 0000000000000040:   68686868 68686868 68686868 68686868 †hhhhhhhhhhhhhhhh 12 0000000000000050:   68686868 68686868 68686868 68686868 †hhhhhhhhhhhhhhhh 13 0000000000000060:   68686868 68686868 68686868 68686868 †hhhhhhhhhhhhhhhh 14 0000000000000070:   68686868 68686868 68686868 68686868 †hhhhhhhhhhhhhhhh 15 0000000000000080:   68686868 68686868 68686868 68686868 †hhhhhhhhhhhhhhhh 16 0000000000000090:   68686868 68686868 68686868 68686868 †hhhhhhhhhhhhhhhh 17 00000000000000A0:   68686868 68686868 68686868 68686868 †hhhhhhhhhhhhhhhh 18 00000000000000B0:   68686868 68686868 68686868 68686868 †hhhhhhhhhhhhhhhh 19 00000000000000C0:   68686868 68686868 68c10000 00010002 †hhhhhhhhh....... 20 00000000000000D0:   00020000 ††††††††††††††††††††††††††††....             21 22 Slot 1, Offset 0x1f04, Length 212, DumpStyle BYTE23 24 Record Type = INDEX_RECORD           Record Attributes =  NULL_BITMAP     Record Size = 21225 26 Memory Dump @0x000000000FE5BF0427 28 0000000000000000:   16484848 48484848 48484848 48484848 †.HHHHHHHHHHHHHHH 29 0000000000000010:   48484848 48484848 48484848 48484848 †HHHHHHHHHHHHHHHH 30 0000000000000020:   48484848 48484848 48484848 48484848 †HHHHHHHHHHHHHHHH 31 0000000000000030:   48484848 48484848 48484848 48484848 †HHHHHHHHHHHHHHHH 32 0000000000000040:   48484848 48484848 48484848 48484848 †HHHHHHHHHHHHHHHH 33 0000000000000050:   48484848 48484848 48484848 48484848 †HHHHHHHHHHHHHHHH 34 0000000000000060:   48484848 48484848 48484848 48484848 †HHHHHHHHHHHHHHHH 35 0000000000000070:   48484848 48484848 48484848 48484848 †HHHHHHHHHHHHHHHH 36 0000000000000080:   48484848 48484848 48484848 48484848 †HHHHHHHHHHHHHHHH 37 0000000000000090:   48484848 48484848 48484848 48484848 †HHHHHHHHHHHHHHHH 38 00000000000000A0:   48484848 48484848 48484848 48484848 †HHHHHHHHHHHHHHHH 39 00000000000000B0:   48484848 48484848 48484848 48484848 †HHHHHHHHHHHHHHHH 40 00000000000000C0:   48484848 48484848 48c10000 00010015 †HHHHHHHHH....... 41 00000000000000D0:   00020000 ††††††††††††††††††††††††††††....       

從上面可以看到,當我再次把刪除的”H"插入到數據頁的時候,發現“H”在201號數據頁的slot1位置了,有人就奇怪了,,,為什么不在slot0

的???仔細想想確實可以告訴我們一個道理,那就是sql是不區別大小寫的,所以“H”和“h”對sqlserver來說都是一樣的,仔細想想其實還有

一個問題,那就是數據頁分裂,比如說當你insert的數據頁已滿,那這時候該怎么辦呢?sqlserver的手段就是數據頁分裂,將滿頁的一半數據

導出到新分配的數據頁,同樣我也可以做個例子。

1 CREATE TABLE Person(ID INT,NAME CHAR(5) DEFAULT 'xxxxx')2 CREATE INDEX idx_Name ON Person(NAME)3 4 DECLARE @i as int=15 WHILE @i<8016 BEGIN7     INSERT INTO dbo.Person(ID) VALUES(@i)8     SET @i=@i+19 END

接下來,我導出126號數據頁的記錄,可以看到它的范圍是1-449,如下圖:

下面我要做的事情就是插入一個ID在1-449范圍的一條記錄,這樣的話就會造成數據頁分裂了,對不對。

可以看到,現在多了一個192號數據頁,是不是很有意思,哈哈~~~然后我就非常好奇的再次導出126,192號數據頁,看看數據是不是只剩

一半啦~~~

三:update操作

  如果你看懂了上面的insert和delete,那么update就是這兩個操作的組合,對不對。。。所以也沒什么好說的。

好了,夜深了,洗洗睡了~


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕欧美日韩精品| 欧美精品日韩三级| 国产精品久久久久久久久久99| 91亚洲精品在线观看| 丁香五六月婷婷久久激情| 一区二区国产精品视频| 欧美wwwxxxx| 久久久免费观看视频| 亚洲加勒比久久88色综合| 九九热这里只有在线精品视| 国产一区二区三区视频| 国产精品三级久久久久久电影| 亚洲午夜性刺激影院| 亚洲精品中文字幕有码专区| 福利一区视频在线观看| 日韩在线观看av| 国产精品久久久av久久久| 亚洲成人激情在线| 日韩亚洲第一页| 91社影院在线观看| 97国产在线观看| 欧美日韩中文字幕在线| 色七七影院综合| 国产欧美日韩中文| 色琪琪综合男人的天堂aⅴ视频| 亚洲综合中文字幕68页| 91精品国产自产在线观看永久| 97在线看免费观看视频在线观看| 亚洲一区美女视频在线观看免费| 久久久久久久久久久91| 亚洲老司机av| 亚洲精品自拍视频| 欧美激情在线观看视频| 欧美三级欧美成人高清www| 欧美一级大片在线观看| 成人福利在线视频| 亚洲最大的网站| 久久综合免费视频| 国产精品久久综合av爱欲tv| 国产婷婷成人久久av免费高清| 4444欧美成人kkkk| 亚洲一区二区三区在线视频| 一区二区三区美女xx视频| 日韩欧美一区视频| 在线电影av不卡网址| 日韩高清av在线| 久久久av亚洲男天堂| 亚洲欧洲美洲在线综合| 国产一区二区三区在线观看视频| 亚洲美女av在线播放| 欧美激情亚洲一区| 福利视频第一区| 国产中文日韩欧美| 亚洲精品天天看| 亚洲天堂av在线播放| 性色av一区二区三区在线观看| 夜夜嗨av一区二区三区四区| 精品久久久久久久久中文字幕| 国内外成人免费激情在线视频| 久久久久久国产精品久久| 久久久久久久一区二区| 日韩最新免费不卡| 欧美精品videosex牲欧美| 精品日韩美女的视频高清| 欧美日韩裸体免费视频| 亚洲国产精品悠悠久久琪琪| 韩国一区二区电影| 中文字幕亚洲欧美| 中文字幕亚洲欧美在线| 8090成年在线看片午夜| 国产一区二区日韩| 国内精品400部情侣激情| 久久福利网址导航| 久久久久国产精品一区| 亚洲片国产一区一级在线观看| 亚洲国产精品国自产拍av秋霞| 欧美日韩精品在线视频| 国产综合色香蕉精品| 日韩在线观看免费| 日韩美女视频中文字幕| 国产精品美乳在线观看| 色妞久久福利网| 热久久美女精品天天吊色| 亚洲变态欧美另类捆绑| 97精品国产91久久久久久| 国语自产偷拍精品视频偷| 国产精品99蜜臀久久不卡二区| 久久精品免费播放| 亚洲国产成人爱av在线播放| 亚洲第一页中文字幕| 国产亚洲一区二区在线| 国产精品一区二区久久国产| 亚洲成色777777女色窝| 乱亲女秽乱长久久久| 中文字幕在线看视频国产欧美| 欧美与黑人午夜性猛交久久久| 日韩成人高清在线| 午夜精品久久久久久久男人的天堂| 97在线观看视频国产| 久久网福利资源网站| 亚洲久久久久久久久久久| 久久成人亚洲精品| 中文字幕久精品免费视频| 日韩一区二区欧美| 日本久久久久亚洲中字幕| 精品久久久久久中文字幕大豆网| 中文字幕在线视频日韩| 国产极品精品在线观看| 国产97在线|亚洲| 国产国产精品人在线视| 亚洲aa中文字幕| 欧美肥老太性生活视频| 久久久黄色av| 亚洲第一级黄色片| 中文字幕亚洲综合久久筱田步美| 亚洲精品视频在线观看视频| 亚洲第一二三四五区| 色悠久久久久综合先锋影音下载| 精品亚洲一区二区三区| 亚洲精品一区二区久| 欧美亚洲一区在线| 久久亚洲精品成人| 国产精品日本精品| 亚洲精品美女在线| 日韩暖暖在线视频| 亚洲色图第三页| 国产成人短视频| 富二代精品短视频| 午夜精品一区二区三区在线| 在线观看免费高清视频97| 成人激情电影一区二区| 欧美色videos| 亚洲第一av网| 亚洲美女性生活视频| 久久久女女女女999久久| 亚洲精品小视频在线观看| 亚洲午夜国产成人av电影男同| 日韩亚洲第一页| 精品自拍视频在线观看| 久久久噜噜噜久噜久久| 久热爱精品视频线路一| 自拍偷拍亚洲精品| 日韩亚洲一区二区| 国产成人a亚洲精品| 三级精品视频久久久久| 亚洲日本欧美中文幕| 久久久久久久久久国产| 亚洲高清在线观看| 久久国产视频网站| 在线播放国产一区中文字幕剧情欧美| 国产在线精品成人一区二区三区| 岛国精品视频在线播放| 欧美视频在线观看 亚洲欧| 欧美放荡办公室videos4k| 91中文字幕一区| 成人激情电影一区二区| 中文字幕自拍vr一区二区三区| 国产精品久久久久秋霞鲁丝| 欧美日韩中文字幕在线视频| 日韩欧美精品在线观看| 97婷婷涩涩精品一区| 国产伊人精品在线| 91美女片黄在线观| 奇门遁甲1982国语版免费观看高清|