国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

MSSQL 的復合索引和包含索引有啥區別?

數據庫 其他數據庫
復合索引? 和 Include索引? 各有利弊吧,前者會讓索引頁的行數據更大,導致索引頁更多,也就會占用更多的存儲空間,更多的邏輯讀,索引維護開銷也更大,而后者只會將 Include 列 保存在葉子節點,不參與索引計算,相對來說占用的索引頁空間更小。

?一、背景

1. 講故事

在 SQLSERVER 中有非常多的索引,比如:聚集索引,非聚集索引,唯一索引,復合索引,Include索引,交叉索引,連接索引,奇葩索引等等,當索引多了之后很容易傻傻的分不清,比如:??復合索引??? 和 ??Include索引??,但又在真實場景中用的特別多,本篇我們就從底層數據頁層面厘清一下。

二、到底有什么區別

1. 這些索引解決了什么問題

說區別之前,一定要知道它們大概解決了什么問題?這里我就從 ??索引覆蓋?? 角度來展開吧,為了方便講述,先上一個測試 sql:


IF(OBJECT_ID('t') IS NOT NULL) DROP TABLE t;

CREATE TABLE t(a INT IDENTITY, b CHAR(6), c CHAR(10) DEFAULT 'aaaaaaaaaa')

SET NOCOUNT ON
DECLARE @num INT
SET @num =10000
WHILE (@num <90000)
BEGIN
INSERT INTO t(b) VALUES ('b'+CAST(@num AS CHAR(5)))
SET @num=@num+1
END

CREATE CLUSTERED INDEX idx_a ON t(a)
CREATE INDEX idx_b ON t(b)

SELECT * FROM t;

圖片

代碼非常簡單,在 t 表中創建三個列,插入 8w 條數據,然后創建兩個索引,接下來做一個查詢獲取 ??b,c?? 列。


SET STATISTICS IO ON
SET STATISTICS TIME ON
SELECT b,c FROM t WHERE b IN ('b10000','b20000','b30000','b40000','b50000','b70000','b80000','b90000')
SET STATISTICS IO OFF
SET STATISTICS TIME OFF

輸出如下:


表“t”。掃描計數 8,邏輯讀取次數 30,物理讀取次數 0,頁面服務器讀取次數 0,預讀讀取次數 0,頁面服務器預讀讀取次數 0,LOb 邏輯讀取次數 0,LOB 邏輯讀取次數 0,LOB 頁面服務器讀取次數 0,LOB 預讀讀取次數 0,LOB 頁面服務器預讀讀取次數 0

SQL Server 執行時間:
CPU 時間 = 0 毫秒,占用時間 = 134 毫秒。

SQL Server 執行時間:
CPU 時間 = 0 毫秒,占用時間 = 0 毫秒。

Completion time: 2023-01-06T08:47:45.2364473+08:00

圖片

從執行計劃看,這是一個經典的 書簽查找?,這種查找返回的行數越多性能越差,在索引優化時一般都會規避掉這種情況,我們也看到了邏輯讀取次數有 30 次,那能不能再小一點呢?

為了解決這個問題,干脆把 c 列也放到索引中去達到索引覆蓋的效果,這就需要用到 復合索引 了,參考sql如下:


CREATE INDEX idx_complex ON t (b,c)

再次查詢輸出如下:


SQL Server 分析和編譯時間:
CPU 時間 = 0 毫秒,占用時間 = 0 毫秒。
表“t”。掃描計數 8,邏輯讀取次數 24,物理讀取次數 0,頁面服務器讀取次數 0,預讀讀取次數 0,頁面服務器預讀讀取次數 0,LOb 邏輯讀取次數 0,LOB 邏輯讀取次數 0,LOB 頁面服務器讀取次數 0,LOB 預讀讀取次數 0,LOB 頁面服務器預讀讀取次數 0

SQL Server 執行時間:
CPU 時間 = 0 毫秒,占用時間 = 96 毫秒。

SQL Server 執行時間:
CPU 時間 = 0 毫秒,占用時間 = 0 毫秒。

Completion time: 2023-01-06T08:53:56.9688921+08:00

圖片

從執行計劃來看,這次沒有走 書簽查找? 而是 索引查找?,并且邏輯讀也降到了 24 次,這是一個好的優化。

相信有些朋友也知道用 Include索引 也能達到這個效果,接下來試著把復合索引給刪了增加一個 Include索引,代碼如下:


DROP INDEX idx_complex ON dbo.t;
CREATE INDEX idx_include ON t(b) INCLUDE (c)

再次查詢輸出如下:


表“t”。掃描計數 8,邏輯讀取次數 16,物理讀取次數 0,頁面服務器讀取次數 0,預讀讀取次數 0,頁面服務器預讀讀取次數 0,LOb 邏輯讀取次數 0,LOB 邏輯讀取次數 0,LOB 頁面服務器讀取次數 0,LOB 預讀讀取次數 0,LOB 頁面服務器預讀讀取次數 0

SQL Server 執行時間:
CPU 時間 = 0 毫秒,占用時間 = 73 毫秒。

SQL Server 執行時間:
CPU 時間 = 0 毫秒,占用時間 = 0 毫秒。

Completion time: 2023-01-06T08:58:18.1122561+08:00

圖片

從執行計劃來看也是走的 非聚集索引?,而且邏輯讀再次降到了 16? 次,相比原始的書簽查找已經優化了 50%,這是一個巨大的性能提升不是。

到這里其實有一個問題,兩種優化走的都是 非聚集索引?,從邏輯讀次數看貌似 Include索引 更好一些,為什么會這樣呢?這就涉及到了底層存儲,接下來一起扒一下。

2. 存儲原理研究

研究它們的不同點,最徹底的方式就是從底層存儲出發,首先我們觀察下 復合索引? 的底層存儲是什么樣的,可以用 DBCC 命令。


DBCC TRACEON(3604)
DBCC IND(MyTestDB,t,-1)

圖片

從 IndexLevel=2? 來看這個復合索引?構成的B樹已經達到了二層,接下來我們查一下 368 號數據頁內容。


DBCC PAGE(MyTestDB,1,368,2)

輸出如下:


PAGE: (1:368)

Memory Dump @0x000000F555578000

000000F555578000: 01020002 00800001 00000000 00001b00 00000000 ....................
000000F555578014: 00000200 3e010000 601f9c00 70010000 01000000 ....>...`...p.......
000000F555578028: f8000000 e0680000 f5010000 00000000 00000000 .....h..............
000000F55557803C: 00000000 01000000 00000000 00000000 00000000 ....................
000000F555578050: 00000000 00000000 00000000 00000000 16623130 .................b10
000000F555578064: 30303061 61616161 61616161 61010000 00380500 000aaaaaaaaaa....8..
000000F555578078: 00010004 00001662 38333631 36616161 61616161 .......b83616aaaaaaa
000000F55557808C: 61616191 1f010070 05000001 00040000 00006231 aaa....p..........b1

OFFSET TABLE:

Row - Offset
1 (0x1) - 126 (0x7e)
0 (0x0) - 96 (0x60)


DBCC 執行完畢。如果 DBCC 輸出了錯誤信息,請與系統管理員聯系。

根據下面的 Slot 個數可以知道這個分支節點數據頁只有 2 條記錄,分別為:(b10000,aaaaaaaaaa,0x01) , (b83616,aaaaaaaaaa,0x011f91)?,這里說明一下最后的 01 和 0x011f91 是主鍵key,接下來找個葉子節點,比如:1632 號索引頁。


PAGE: (1:1632)


Memory Dump @0x000000F555578000

...
000000F555578050: 00000000 00000000 00000000 00000000 16623135 .................b15
000000F555578064: 32383761 61616161 61616161 61a81400 00040000 287aaaaaaaaaa.......
000000F555578078: 16623135 32383861 61616161 61616161 61a91400 .b15288aaaaaaaaaa...
000000F55557808C: 00040000 16623135 32383961 61616161 61616161 .....b15289aaaaaaaaa
000000F5555780A0: 61aa1400 00040000 16623135 32393061 61616161 a........b15290aaaaa
000000F5555780B4: 61616161 61ab1400 00040000 16623135 32393161 aaaaa........b15291a
000000F5555780C8: 61616161 61616161 61ac1400 00040000 16623135 aaaaaaaaa........b15
000000F5555780DC: 32393261 61616161 61616161 61ad1400 00040000 292aaaaaaaaaa.......
000000F5555780F0: 16623135 32393361 61616161 61616161 61ae1400 .b15293aaaaaaaaaa...
000000F555578104: 00040000 16623135 32393461 61616161 61616161 .....b15294aaaaaaaaa
000000F555578118: 61af1400 00040000 16623135 32393561 61616161 a........b15295aaaaa
000000F55557812C: 61616161 61b01400 00040000 16623135 32393661 aaaaa........b15296a
000000F555578140: 61616161 61616161 61b11400 00040000 16623135 aaaaaaaaa........b15
...

從葉子節點上看,也是 (b,c,key) 的布局模式,這時候腦子里就有了一張圖。

圖片

用同樣的方式觀察下 Include索引?,發現 IndexLevel=1,說明只有一層。

圖片

再用 DBCC 觀察下分支節點的布局。


PAGE: (1:1696)

Memory Dump @0x000000F554F78000

000000F554F78000: 01020001 00820001 00000000 00001100 00000000 ....................
000000F554F78014: 00000601 42010000 1c09d814 a0060000 01000000 ....B.... ..........
000000F554F78028: 0f010000 78310000 39010000 00000000 00000000 ....x1..9...........
000000F554F7803C: f01efa04 00000000 00000000 00000000 00000000 ....................
000000F554F78050: 00000000 00000000 00000000 00000000 16623130 .................b10
000000F554F78064: 30303001 00000088 03000001 00030000 16623130 000..............b10
000000F554F78078: 33313138 010000b0 03000001 00030000 16623130 3118.............b10
000000F554F7808C: 3632326f 020000b1 03000001 00030000 16623130 622o.............b10
000000F554F780A0: 393333a6 030000b2 03000001 00030000 16623131 933..............b11
...

從輸出看并沒有記錄 列c? 的值,就是那煩人的 aaaaaaaaaa,然后再抽個葉子節點看看,比如:1218號索引頁。


PAGE: (1:1218)
Memory Dump @0x000000F554F78000

000000F554F78000: 01020000 04020001 c1040000 01001500 c3040000 ....................
000000F554F78014: 01003701 42010000 0a00881d c2040000 01000000 ..7.B...............
000000F554F78028: 0f010000 00310000 03000000 00000000 00000000 .....1..............
000000F554F7803C: e7351886 00000000 00000000 00000000 00000000 .5..................
000000F554F78050: 00000000 00000000 00000000 00000000 16623833 .................b83
000000F554F78064: 313235a6 1d010061 61616161 61616161 61040000 125....aaaaaaaaaa...
000000F554F78078: 16623833 313236a7 1d010061 61616161 61616161 .b83126....aaaaaaaaa
000000F554F7808C: 61040000 16623833 313237a8 1d010061 61616161 a....b83127....aaaaa
000000F554F780A0: 61616161 61040000 16623833 313238a9 1d010061 aaaaa....b83128....a
000000F554F780B4: 61616161 61616161 61040000 16623833 313239aa aaaaaaaaa....b83129.
000000F554F780C8: 1d010061 61616161 61616161 61040000 16623833 ...aaaaaaaaaa....b83
000000F554F780DC: 313330ab 1d010061 61616161 61616161 61040000 130....aaaaaaaaaa...
...

在葉子節點中我們終于看到了 aaaaaaaaaa ,其實想一想肯定是有的,不然怎么做索引覆蓋呢?有了這些信息,腦子中又有了一張圖。

圖片

從圖中可以看出,Include索引? 的分支節點是不包含 c? 列的,這個列只會保存在 葉子節點? 中,再結合樹的高度來看就能解釋為什么 Include索引? 的邏輯讀要少于 復合索引。

三、總結

總的來說 復合索引? 和 Include索引? 各有利弊吧,前者會讓索引頁的行數據更大,導致索引頁更多,也就會占用更多的存儲空間,更多的邏輯讀,索引維護開銷也更大,而后者只會將 Include 列 保存在葉子節點,不參與索引計算,相對來說占用的索引頁空間更小。

在查詢方面,復合索引能達到的索引覆蓋場景遠大于單列索引,而且在過濾,排序場景下也能發揮奇效,所以還是根據你的讀寫比例做一個取舍吧。

責任編輯:武曉燕 來源: 一線碼農聊技術
相關推薦

2010-10-12 13:42:11

MySQL單列索引

2010-11-11 15:48:54

MySQL單列索引

2010-10-12 16:50:14

MySQL Hash索

2024-04-16 09:53:56

PostgreSQL數據庫優化索引

2020-12-09 08:59:59

MongoDB復合索事故

2011-04-22 14:45:45

SQL索引

2010-04-20 09:22:27

Oracle 復合類型

2023-11-16 17:12:33

數據庫oracle

2021-12-29 07:01:53

Mysql復合索引

2022-01-17 10:07:05

PodmanDocker容器

2022-06-13 07:36:06

MySQLInnoDB索引

2021-04-19 09:27:03

Java線程操作系統

2021-12-31 09:23:22

SDNSD-WAN網絡技術

2010-07-19 14:48:27

SQL Server索

2010-09-27 11:24:37

SQL聚簇索引

2010-07-14 15:04:53

SQL Sever索引

2018-07-17 14:29:57

云桌面

2022-09-15 08:38:39

WebCPU數量

2015-09-07 14:31:33

云計算SDNNFV

2020-04-16 12:04:09

5G基站4G
點贊
收藏

51CTO技術棧公眾號

99福利在线| 中文av在线播放| 日韩电影在线观看完整版| 国产精选在线| av基地在线| 久久嫩草精品久久久精品| 亚洲一区中文日韩| 国产成人无码一二三区视频| 欧美猛男超大videosgay| 亚洲一区二区在线免费观看| 亲子伦视频一区二区三区| 日韩三级视频在线观看| 在线xxxx| 日韩欧美国产综合一区| 91在线中文字幕| 成人在线视频免费| 欧美日韩在线亚洲一区蜜芽| 久久婷婷国产91天堂综合精品| 日韩一区二区久久| 国产精品嫩草影院一区二区| 91麻豆精品国产综合久久久 | 国产精品高潮呻吟久久av无限| 在线观看网站免费入口在线观看国内| 狠狠色香婷婷久久亚洲精品| 韩国av电影免费观看| 1000精品久久久久久久久| av之家在线观看| 国精产品一区一区三区mba视频 | 久久精品二区| 亚洲天堂偷拍| 国产精品18毛片一区二区| 亚洲高清av| 成人区精品一区二区| 久久久久久久久久久国产| www.国产精品| 日韩中文视频免费在线观看| 69堂免费精品视频在线播放| 中文国产成人精品| 97欧美成人| 久久久国产视频| 亚洲电影二区| 久久五月天综合| 99精品在免费线偷拍| 亚洲精品电影网| 国产中文在线播放| 日韩av在线最新| 久久久人成影片一区二区三区在哪下载| 日韩精品福利网站| 日本综合视频| 欧美成人精品一区二区三区| 涩爱av色老久久精品偷偷鲁| 91精品国产91久久久久久不卡| 麻豆国产欧美一区二区三区r| 7777免费精品视频| 欧美影院三区| 3d蒂法精品啪啪一区二区免费| 欧美大片一区| 蜜桃av色综合| 开心九九激情九九欧美日韩精美视频电影 | 亚洲日本丝袜连裤袜办公室| 九色视频网站入口| 欧美日韩综合视频网址| 91社区在线| 欧美一级生活片| 波多野结衣中文字幕久久| 久久99精品久久久久久噜噜| 无码日韩精品一区二区免费| 99re视频在线播放| 成人午夜短视频| 毛片毛片毛片毛片| 亚洲精品久久久久久久久久久久久 | 秋霞成人午夜鲁丝一区二区三区 | 中文字幕日韩有码| 成人午夜三级| 日本女人一区二区三区| 最新av在线免费观看| 久久这里都是精品| 伊人75在线| 精品播放一区二区| 欧美2区3区4区| 成人国产精品久久久久久亚洲| 天堂精品一区二区三区| 久久亚洲精品伦理| 天天综合久久| 99在线看视频| 国产一区二区电影| 高清日韩av| 91麻豆精品国产91久久久久久久久| 免费h视频在线观看| 久久久久久国产| 亚洲午夜极品| 又粗又黑又大的吊av| 性做久久久久久免费观看欧美| 免费在线观看的电影网站| 欧美精品18videosex性欧美| 国产亚洲一级| 嫩草av久久伊人妇女超级a| 欧美性色欧美a在线播放| 高清久久一区| 国产精品二区二区三区| 久久日韩粉嫩一区二区三区| 国产精品久久久久一区二区国产| 国产一区二区三区久久精品| 欧美日本在线| 亚洲国产成人va在线观看麻豆| 精品污污网站免费看| 成年永久一区二区三区免费视频| 7777精品伊久久久大香线蕉语言| 99精品国产91久久久久久| 亚洲欧美视频一区二区| 欧美激情精品久久久久久蜜臀 | 手机在线电影一区| 久久人人爽人人爽人人av| 色综合色综合色综合| 国语精品视频| 日本精品一区二区三区高清 久久 日本精品一区二区三区不卡无字幕 | 日韩欧美高清视频| 国产亚洲人成a在线v网站| 免费影院在线观看一区| 亚洲精品成人a在线观看| 一区二区三区四区精品视频| 亚洲成人自拍| 欧美午夜不卡视频| 免费av一区二区三区四区| 97在线国产视频| 日韩精品在线一区二区| 国产伦精品一区二区三区免费优势| 视频一区二区三区免费观看| 亚洲电影一级黄| 成人福利一区| 亚洲 高清 成人 动漫| 精品88久久久久88久久久 | 国内免费久久久久久久久久久 | 日韩激情视频| 国产电影一区二区| 精品国产一区二区三| 亚洲曰韩产成在线| 视频一区视频二区欧美| 国产精品美女在线播放| 色av成人天堂桃色av| 外国成人在线视频| 国产乱子夫妻xx黑人xyx真爽 | 熟女性饥渴一区二区三区| 日韩www在线| 久久亚洲影院| 香蕉视频在线看| 91免费观看网站| 亚洲一线二线三线久久久| 牛牛精品成人免费视频| 日本激情视频在线播放| 久久99精品视频一区97| 99久久99久久精品国产片果冻| 免费黄网在线观看| 国产精品无码专区在线观看| 亚洲欧美视频在线观看视频| 成人免费在线观看视频| 日韩一级免费看| 日韩在线免费视频| www.亚洲国产| 久久精品国产大片免费观看| 亚洲欧洲精品一区二区| 亚洲欧美日韩国产精品| 久久久久久久久久美女| 精品理论电影在线| 2019亚洲日韩新视频| 日本10禁啪啪无遮挡免费一区二区 | 精品一区二区三区免费看| 日本成人在线网站| 国产91色在线|亚洲| 日韩精品一区二区三区视频在线观看| 久久99国产精品麻豆| 国产精品va视频| 在线视频手机国产| 亚洲第一久久影院| 国产午夜精品美女毛片视频| 国产精品综合久久| 日韩午夜免费| 国产一区二区h| 亚洲国产精品久久久| 好吊一区二区三区| zzzwww在线看片免费| 国产区视频在线| 116美女写真午夜一级久久| 日本十八禁视频无遮挡| 在线免费观看成人网| 92看片淫黄大片看国产片| 69久久夜色精品国产69| 最新国产精品亚洲| 久久99精品久久久久久噜噜| 久久精品2019中文字幕| 亚洲精品网址在线观看| 亚洲欧美中文字幕| 日韩中文字幕在线精品| 日韩中文字幕在线免费观看| 国产亚洲人成a一在线v站| 色999韩欧美国产综合俺来也| 中午字幕在线观看| 在线中文字幕电影| 日本成人片在线| 果冻天美麻豆一区二区国产|