SQL SERVER大话存储结构(4)_复合索引与包含索引

1 语法及说明
--复合索引
CREATE INDEX IndexName ON tbname(columna,columnb [,columnc...] ) --包含索引
CREATE INDEX IndexName ON tbname(columna [,columnb,columnc...] ) INCLUDE (column1 [,column2,column3...])
2 索引页存储情况
2.1 创建测试表格
CREATE TABLE tbindex(
id int identity(1,1) not null primary key ,
name varchar(50) not null,
type varchar(10) not null,
numbers int not null
)
GO CREATE INDEX ix_number_name ON tbindex(numbers,name)
GO
CREATE INDEX ix_name ON tbindex(numbers) INCLUDE (name)
GO DECLARE @ID INT
SET @ID=1
WHILE @ID<=5
BEGIN
INSERT INTO tbindex(name,type,numbers)
SELECT
name,
type,
object_id+@id
FROM sys.objects SET @ID=@ID+1
END
2.2 分析索引行
--查看该表格索引的id情况
SELECT * FROM sys.indexes WHERE object_id=object_id('tbindex')
--PK__tbindex__3213E83F89582AC3 1
--ix_number_name 2
--ix_number 3 DBCC traceon(3604)
DBCC ind('dbpage','tbindex',-1) DBCC PAGE('dbpage',1,395,3)
DBCC PAGE('dbpage',1,396,3) DBCC PAGE('dbpage',1,397,3)
DBCC PAGE('dbpage',1,398,3)


.png)
- 复合索引 IX_number_name的索引节点为pageid=395,再挑选一个叶子结点来分析 pageid=396;
- 包含索引 IX_number 的索引节点为 pageid=397,再挑选一个叶子节点来分析 pageid=398。
3 对查询的影响
3.1 复合索引查询注意事项
create table tb_composite(
id int identity(1,1) not null primary key,
name varchar(50) not null,
userid int not null,
timepoint datetime not null
)
GO create index ix_userid_name on tb_composite(userid,name)
GO create index ix_userid on tb_composite(userid)
GO INSERT INTO tb_composite(name,userid,timepoint)
SELECT
newid(),orderid%10000 ,CreatedDate
FROM ORDERS
大数据表格
--查看表格的数据大小跟非聚集索引大小
WITH DATA AS (
SELECT O.name tb_name,
reservedpages = SUM (reserved_page_count),
usedpages = SUM (used_page_count),
pages = SUM (CASE WHEN (index_id < 2) THEN (in_row_data_page_count + lob_used_page_count + row_overflow_used_page_count) ELSE 0 END ),
rowCounts = SUM (CASE WHEN (index_id < 2) THEN row_count ELSE 0 END )
FROM sys.dm_db_partition_stats S
JOIN sys.objects o on s.object_id=o.object_id
WHERE O.type='U'
GROUP BY O.name
)
SELECT tb_name,
rowCounts,
reservedpages*8/1024 reserved_Mb,
pages*8/1024 data_Mb,
index_Mb=(usedpages-pages)*8/1024,
unused_Mb=case when usedpages>reservedpages then 0 else (reservedpages-usedpages)*8/1024 end
FROM DATA
WHERE tb_name = 'tb_composite'
ORDER BY reserved_Mb DESC
Go


.png)

.png)

.png)
.png)
- 最左匹配原则:复合索引 键值列假设为(a, b, c, d, e),则等同于索引这几个索引:(a)、(a, b)、(a, b, c)、(a, b, c, d)、(a, b, c, d, e)
- 当where条件 符合 最左匹配原则,那么,执行计划则是 INDEX SEEK ,走索引查找;
- 当where条件 不符合 最左匹配原则,则根据性能评估,走primary index scan 或者 非聚集索引扫描再根据键值去 primary key lookup ;
- 根据最左匹配原则,可以在日常管理中,避免添加一些冗余冗余索引
- 但是也有一个注意事项:随着复合索引的列增加,索引页也会增加,使用其索引会增加一定量的IO,所以,再判断冗余索引的时候,需要考虑下这种情况,通常很少碰到这种情形。
3.2 复合索引与包含索引的查询区别
.png)
.png)

- 如果where 条件包含include列
- include列无法参与 index seek,因为其索引子节点不存在,只存在于索引叶子节点,所以include列一般都是 展示列;
- include列由于无法做 where 过滤的 index seed,同比 复合索引,IO相对会较大
- 如果展示列仅限于索引键值及include列
- 包含索引中,根据索引键值找到 索引叶子节点后,无须根据主键值或者RID值 回表 去查询行记录,而是直接把 索引叶子节点的 include 列的内容展示即可,减少 回表 的IO;
- 如果where条件仅含键值列,select 展示列仅含 键值列级include列
- 两者性能基本一致,包含索引相对少IO,但是区别不大。
- 所有非聚集索引的限制长度是900个字节,但是 包含索引中的 include列是不计算在索引长度中的,所以如果要是遇到这种索引超过 900 bytes的特殊情况,可以考虑把相关字段放到include中来处理。
SQL SERVER大话存储结构(4)_复合索引与包含索引的更多相关文章
- SQL SERVER大话存储结构(3)_数据行的行结构
一行数据是如何来存储的呢? 变长列与定长列,NULL与NOT NULL,实际是如何整理存放到 8k的数据页上呢? 对表格进行增减列,修改长度,添加默认值等DDL SQL ...
- SQL SERVER大话存储结构(6)_数据库数据文件
数据库文件有两大类:数据文件跟日志文件,每一个数据库至少各有一个数据文件或者日志文件,数据文件用来存储数据,日志文件用来存储数据库的事务修改情况,可用于恢复数据库使用. 这里分 ...
- SQL SERVER大话存储结构(5)_SQL SERVER 事务日志解析
本系列上一篇博文链接:SQL SERVER大话存储结构(4)_复合索引与包含索引 1 基本介绍 每个数据库都具有事务日志,用于记录所有事物以及每个事物对数据库所作的操作. 日志的记录 ...
- SQL SERVER大话存储结构(1)_数据页类型及页面指令分析
如果转载,请注明博文来源: www.cnblogs.com/xinysu/ ,版权归 博客园 苏家小萝卜 所有.望各位支持! SQLServer的数据页大 ...
- SQL SERVER大话存储结构(2)_非聚集索引如何查找到行记录
如果转载,请注明博文来源: www.cnblogs.com/xinysu/ ,版权归 博客园 苏家小萝卜 所有.望各位支持! 1 行记录如何存储 这里引入两个 ...
- 人人都是 DBA(VIII)SQL Server 页存储结构
当在 SQL Server 数据库中创建一张表时,会在多张系统基础表中插入所创建表的信息,用于管理该表.通过目录视图 sys.tables, sys.columns, sys.indexes 可以查看 ...
- [转帖]真TM长的:SQL Server 2008存储结构——GAM和SGAM、PFS结构、IAM结构、DCM&BCM
谈到GAM和SGAM,我们不得不从数据库的页和区说起. https://blog.csdn.net/snowfoxmonitor/article/details/49991015 一个数据库由用户定义 ...
- SQL Server 列存储索引强化
SQL Server 列存储索引强化 SQL Server 列存储索引强化 1. 概述 2.背景 2.1 索引存储 2.2 缓存和I/O 2.3 Batch处理方式 3 聚集索引 3.1 提高索引创建 ...
- MySQL的redo log结构和SQL Server的log结构对比
MySQL的redo log结构和SQL Server的log结构对比 innodb 存储引擎 mysql技术内幕 log buffer根据一定规则将内存中的log block刷写到磁盘,这个规则是 ...
随机推荐
- JAVA经典算法40题
1: JAVA经典算法40题 2: [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 3 ...
- es6 module + webpack
其实在之前本人就看了 es6 里面的一部分内容,当然是阮一峰大神的 ECMAScript 6 入门. 最近闲来无事又来看下,其中 Module 的语法 这章时候,用里面代码跑的时候,理所当然的报错 S ...
- Android系统--输入系统(九)Reader线程_核心类及配置文件
Android系统--输入系统(九)Reader线程_核心类及配置文件 1. Reader线程核心类--EventHub 1.1 Reader线程核心结构体 实例化对象:mEventHub--表示多个 ...
- 某马-某淘商城的day01--->分析,工程搭建,tomcat插件启动工程,svn,反思
-1:为什么还要写某马的某淘商城呢? 答:万物更新,季节交替.新人总把旧人换.所以呢,前人写了N多遍的东西,我们依旧在学,所以下决心写某马的某淘商城.(也因为在学校还没找工作,所以找个相对长期的事情做 ...
- 【渗透测试】PHPCMS9.6.0 任意文件上传漏洞+修复方案
这个漏洞是某司的一位前辈发出来的,这里只是复现一下而已. 原文地址:https://www.t00ls.net/thread-39226-1-1.html 首先我们本地搭建一个phpcms9.6.0的 ...
- 【转】QQ传输文件原理参考(来自互联网)
QQ的文件发送是怎样的过程呢?通常,发送文件的计算机首先要通过消息服务器将其IP地址发送给接收计算机,当接收计算机同意接收的确认消息反馈到消息服务器后,消息服务器将据此设置好文件传输对话.随即,发送计 ...
- RedHat 7.1 下安装 Zabbix监控程序详解(适合linux初级用户)
RedHat 7.1 安装 Zabbix 监控程序详解(适合对linux初级用户)2017-05-02 安装步骤: 1.zabbix需要安装LAMP架构 2.安装zabbix服务 3.初始化zabbi ...
- Android NDK开发之从Java与C互调中详解JNI使用(一)
生活 这一个礼拜过得真的是苦不堪言,上周因为打球脚踝直接扭伤,肿的想猪蹄一样,然后休息几天消肿了,可以缓慢龟速的行走了,然而五一回来上班第一天,上班鞋子还能穿上,下班脚已插不进鞋子里面了,好吧,又肿回 ...
- 四、I/O
九.什么是I/O: 9.1.在Windows程序中,基础的运行单位为线程,为每一个线程分配一个处理器,可以让系统执行多个操作, 9.2.当线程进行一个I/O操作时,会被挂起,从而影响性能,为了解决这类 ...
- POJ1006: 中国剩余定理的完美演绎(非原创)
问题描述 人自出生起就有体力,情感和智力三个生理周期,分别为23,28和33天.一个周期内有一天为峰值,在这一天,人在对应的方面(体力,情感或智力)表现最好.通常这三个周期的峰值不会是同一天.现在给出 ...