日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Sql Server之旅——第七站 复合索引和include索引到底有多大区别?

發布時間:2023/12/4 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Sql Server之旅——第七站 复合索引和include索引到底有多大区别? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

索引和鎖,這兩個主題對我們開發工程師來說,非常的重要。。。只有理解了這兩個主題,我們才能寫出高質量的sql語句,在之前的博客中,我所說的索引都是單列索引。。。當然數據庫不可能只認單列索引,還有我這篇的復合索引,說到復合索引,可能熟悉的人又會說到include,那這兩個索引到底有什么區別呢? 我也是菜鳥一枚。。。所以下面的也是我的個人見解。。。

一:從數據頁角度看問題

1. 做兩個表,插入兩條數據,在test1上做復合索引,在test2上做include索引,如下圖:

-- 在test1表中插入2條記錄 CREATE TABLE test1(ID int,Name CHAR(5),Email CHAR(10)) INSERT INTO test1 VALUES(1,'aaaaa','111@qq.com') INSERT INTO test1 VALUES(2,'bbbbb','222@qq.com') CREATE INDEX idx_test1 ON dbo.test1(Name,Email)-- 在test2表中插入2條記錄 CREATE TABLE test2(ID int,Name CHAR(5),Email CHAR(10)) INSERT INTO test2 VALUES(1,'aaaaa','111@qq.com') INSERT INTO test2 VALUES(2,'bbbbb','222@qq.com') CREATE INDEX idx_test2 ON dbo.test2(Name) INCLUDE(Email)

2. 然后通過DBCC 命令查看數據頁記錄

<1> 先來看看test1表中各個槽位的信息

DBCC TRACEON(2588,3604) DBCC IND(Ctrip,test1,-1) DBCC PAGE(Ctrip,1,194,1)Slot 0, Offset 0x60, Length 27, DumpStyle BYTERecord Type = INDEX_RECORD Record Attributes = NULL_BITMAP Record Size = 27Memory Dump @0x000000000FB0A0600000000000000000: 16616161 61613131 31407171 2e636f6d ?.aaaaa111@qq.com 0000000000000010: c0000000 01000000 030000?????????????...........Slot 1, Offset 0x7b, Length 27, DumpStyle BYTERecord Type = INDEX_RECORD Record Attributes = NULL_BITMAP Record Size = 27Memory Dump @0x000000000FB0A07B0000000000000000: 16626262 62623232 32407171 2e636f6d ?.bbbbb222@qq.com 0000000000000010: c0000000 01000100 030000?????????????...........OFFSET TABLE:Row - Offset 1 (0x1) - 123 (0x7b) 0 (0x0) - 96 (0x60)

<2> 再來看看test2表中各個槽位信息

DBCC TRACEON(2588,3604) DBCC IND(Ctrip,test2,-1) DBCC PAGE(Ctrip,1,207,1)Slot 0, Offset 0x60, Length 27, DumpStyle BYTERecord Type = INDEX_RECORD Record Attributes = NULL_BITMAP Record Size = 27Memory Dump @0x000000000DFCA0600000000000000000: 16616161 6161c400 00000100 00003131 ?.aaaaa........11 0000000000000010: 31407171 2e636f6d 030000?????????????1@qq.com...Slot 1, Offset 0x7b, Length 27, DumpStyle BYTERecord Type = INDEX_RECORD Record Attributes = NULL_BITMAP Record Size = 27Memory Dump @0x000000000DFCA07B0000000000000000: 16626262 6262c400 00000100 01003232 ?.bbbbb........22 0000000000000010: 32407171 2e636f6d 030000?????????????2@qq.com...OFFSET TABLE:Row - Offset 1 (0x1) - 123 (0x7b) 0 (0x0) - 96 (0x60)

<3> 從test1和test2的數據頁來看,都是有兩個slot槽位,然后我們把test1和test2的slot0槽位拿出來對比下,是不是就知道兩者大概有什么區別了。

test1のslot0

0000000000000000: 16616161 61613131 31407171 2e636f6d ?.aaaaa111@qq.com 0000000000000010: c0000000 01000000 030000?????????????...........

test2のslot0

0000000000000000: 16616161 6161c400 00000100 00003131 ?.aaaaa........11 0000000000000010: 31407171 2e636f6d 030000?????????????1@qq.com...

下面我仔細解剖下兩表中的slot內容:

  • 16 6161616161 3131314071712e636f6d c0000000 0100 0000 0300 00

16: 這個是索引記錄的系統頭數據。

6161616161: 轉換成十進制就是9797979797,也就是字符的aaaaa。

3131314071712e636f6d: 這個我想你也懂,也就是111@qq.com。

c000000010000000: 因為我們是堆表,所以這個就是表的RowID,轉化為十進制就是:192:1:0。

0300:這個表示表中的記錄數,也就是3條記錄。

如果你對上面的講解明白了,那我們繼續看看test2のslot0,如果你仔細的話,你會看到在test2中,111qq.com是在記錄的最后。。。那這說明什么問題呢???如果你對記錄比較熟悉的話,你就知道,其實記錄中的變長字段值一般都是放在記錄的尾部。。。好處就是可以做到“行溢出”。也就是可以超過索引的900長度限制。。。而復合索引卻無法做到。。。如果你不信我可以做個例子,將name和email的長度設為定長500。

而include索引卻可以順利通過。。。。。

夜深了,不準備繼續說了。。。下一篇繼續扯下復合索引到底都能帶來哪些好處。

總結

以上是生活随笔為你收集整理的Sql Server之旅——第七站 复合索引和include索引到底有多大区别?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。