测试表结构:

CREATE TABLE TB1
(
ID INT IDENTITY(1,1),
C1 INT,
C2 INT
)

1. 聚集索引(Clustered index)

聚集索引可以理解为一个包含表中除索引键外多有剩余列的包含索引,为保证在DELETE/UPDATE操作的正确性,如果聚集索引未声明为唯一(UNIQUE),则系统会聚集索引键增加一个NULLABLE的INT类型标识列(UNIQUIFIER)以保证记录唯一性。

唯一聚集索引:

CREATE UNIQUE CLUSTERED INDEX IDX_ID
ON TB1
(
ID
)

非唯一聚集索引:

CREATE CLUSTERED INDEX IDX_ID
ON TB1
(
ID
)

2. 非唯一非聚集索引

为从非聚集索引定位到数据,对于堆表,非聚集索引会存放索引键+数据的RID(FILE_ID+PAGE_ID+SLOT_ID),对于聚集表,非聚集索引会存放索引键+聚集索引键。

非聚集索引:

CREATE INDEX IDX_C1
ON TB1
(
C1
)

堆表上非聚集索引:

唯一聚集索引表上非聚集索引:

非唯一聚集索引表非聚集索引:

--==============================

后续的测试默认使用唯一聚集索引

--==============================

3. 唯一非聚集索引

唯一非聚集索引与非唯一非聚集索引的区别主要在非叶子节点上,唯一非聚集索引的非叶子节点上不会包含RID的数据。

唯一非聚集索引:

CREATE UNIQUE INDEX IDX_C1_UNI
ON TB1
(
C1
)

4. 包含索引

包含索引在SQL SERVER 2008版本中引入,包含列的数据只存在在叶子节点上。包含列不影响索引行的位置(不会被排序),且包含列不会影响索引键的大小(SQL SERVER 限制索引键不得超过900字节)

CREATE INDEX IDX_C1_INC_C2
ON TB1
(
C1
)INCLUDE
(
C2
)

5. 过滤索引

当过滤列不作为索引键或包含列时,系统无需在索引中存放过滤列的数据,因此过滤列不会出现在索引的叶子节点和非叶子节点上。

CREATE INDEX IDX_C1_WH_C2
ON TB1
(
C1
)
WHERE C2>1

--=============================================================

总结&建议:

1. 对于聚集表,由于索引非聚集索引都会包含聚集键,因此建议优先考虑静态+唯一+递增+长度较小的索引键作为索引键

 a. 静态:当聚集键被更新时,除了将表数据移动到相应的位置上,依次更新所有的非聚集索引,会消耗大量资源,并导致页拆分和索引碎片

 b. 唯一: 非唯一聚集索引增加2至6个字节的消耗,导致聚集索引和非聚集索引消耗更多页面

c. 递增:对于非递增的聚集索引键来说,插入操作会引发页拆分和索引碎片  

 d. 长度较小:长度较大的聚集索引键同样会导致聚集索引和非聚集索引消耗更多页面,尤其是导致索引层数增加,增加INDEX SEEK的开销。

2. 索引列的可选择性和索引列顺:高选择性不代表该列就适合放在索引前部,还应该考虑针对该列是范围查询还是等值查询,如订单表的创建时间列CreatedTime主要用作范围查询,而订单表的产品编号ProductID主要用等值查询,那么对于

WHERE ProductID=@P1     
AND CreatedTime>@P2
AND CreatedTime<@p3

这样的查询,索引 INDEX(ProductID,CreatedTime)就会比INDEX(CreatedTime,ProductID) 更高效(消耗更少的CPU和IO资源)。

3. 索引列顺序与统计:索引列先后顺序不同,其对于的统计信息的密度(density)和直方图(histogram)也不相同,会间接影响到生成的执行计划。

4. 对于选择性较低且位于索引列后端的列来说,可以考虑将其放入到包含索引列中。

5. 虽然过滤索引在统计信息更新方面存在一定的问题,过滤索引依然是解决部分疑难杂症的必杀技(如SELECT TOP(10) * FROM orders WHERE ProductID>10000 ORDER BY OrderID DESC)

6. 在对递增的列建立索引时,应考虑统计过期导致执行计划低效的问题,如对订单表上创建日期列建立索引。

--==========================================================

写得不好,靠妹子加分啦。。

INDEX--从数据存放的角度看索引的更多相关文章

  1. INDEX--从数据存放的角度看索引2

    在上次<INDEX--从数据存放的角度看索引>中,我们说到"唯一非聚集索引"和“非唯一非聚集索引”在存储上有一个明显的差别:唯一非聚集索引的非叶子节点上不会包含RID的 ...

  2. 深度挖坑:从数据角度看人脸识别中Feature Normalization,Weight Normalization以及Triplet的作用

    深度挖坑:从数据角度看人脸识别中Feature Normalization,Weight Normalization以及Triplet的作用 周翼南 北京大学 工学硕士 373 人赞同了该文章 基于深 ...

  3. 对博弈活动中蕴含的信息论原理的讨论,以及从熵角度看不同词素抽象方式在WEBSHELL文本检测中的效果区别

    1. 从赛马说起 0x1:赛马问题场景介绍 假设在一场赛马中有m匹马参赛,令第i匹参赛马获胜的概率为pi,如果第i匹马获胜,那么机会收益为oi比1,即在第i匹马上每投资一美元,如果赢了,会得到oi美元 ...

  4. MySQL在创建数据表的时候创建索引

    转载:http://www.baike369.com/content/?id=5478 MySQL在创建数据表的时候创建索引 在MySQL中创建表的时候,可以直接创建索引.基本的语法格式如下: CRE ...

  5. 从互联网进化的角度看AI+时代的巨头竞争

    今天几乎所有的互联网公司在谈论和布局人工智能,收购相关企业.人工智能和AI+成为当今科技领域最灸手可热的名词,关于什么是AI+,其概念就是用以表达将"人工智能"作为当前行业科技化发 ...

  6. android的程序运行数据存放在哪里?

    Android应用开发中,给我们提供了5种数据的存储方式1 使用SharedPreferences存储数据2 文件存储数据3 SQLite数据库存储数据4 使用ContentProvider存储数据5 ...

  7. Android IOS WebRTC 音视频开发总结(四八)-- 从商业和技术的角度看视频行业的机会

    本文主要从不同角度介绍视频行业的机会,文章来自博客园RTC.Blacker,支持原创,转载必须说明出处,欢迎关注个人微信公众号blacker ----------------------------- ...

  8. 【阿里云产品公测】以开发者角度看ACE服务『ACE应用构建指南』

    作者:阿里云用户mr_wid ,z)NKt#   @I6A9do   如果感觉该评测对您有所帮助, 欢迎投票给本文: UO<claV   RsfTUb)<   投票标题:  28.[阿里云 ...

  9. [置顶] 从引爆点的角度看360随身wifi的发展

    从引爆点的角度看360随身wifi的发展 不到一个月的时间,随身wifi预定量就数百万.它的引爆点在哪里,为什么相同的产品这么多它却能火起来,通过对随身wifi的了解和我知识层面分析,主要是因为随身w ...

随机推荐

  1. JDK 之 NIO 2 WatchService、WatchKey(监控文件变化)

    JDK 之 NIO 2 WatchService.WatchKey(监控文件变化) JDK 规范目录(https://www.cnblogs.com/binarylei/p/10200503.html ...

  2. Python之路(第十篇)迭代器协议、for循环机制、三元运算、列表解析式、生成器

    一.迭代器协议 a迭代的含义 迭代器即迭代的工具,那什么是迭代呢? #迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 b为何要有迭代器? 对于序列类型:字符串.列表 ...

  3. wepy中页面的跳转

    1.在pages中创建好页面之后,需要在app.wpy中的config中配置好页面路由:2.如果跳转的按钮在page页面中 this.$navigate({url:"content" ...

  4. [C#.net]处理UTF-8文件乱码

    今天帮同事处理一个2M左右的文件的格式,发现使用Encoding.default & Encoding.UTF8 & Encoding.GetEncoding("GB2312 ...

  5. 20155312 2016-2017-2《Java程序设计》课程总结

    20155312 2016-2017-2<Java程序设计>课程总结 每周作业链接汇总 预备作业1:你期望的师生关系是什么? 预备作业2:做中学learning by doing个人感想 ...

  6. 42.OC中instancetype与id的区别

    区别: 在ARC(Auto Reference Count)环境下: instancetype用来在编译期确定实例的类型,而使用id的话,编译器不检查类型,运行时检查类型 在MRC(Manual Re ...

  7. 2018.11.04 NOIP训练 小水塘(并查集)

    传送门 这是复习普及组的时候做过的题了. 之前一直觉得很难码没有去做. 现在发现可以用并查集直接水过去. 其实就是把题目中说的连通的部分的面积用带权并查集维护一下就行了. 代码: #include&l ...

  8. Yii2 数据库查询汇总

    1.基础查询 User::find()->all(); 此方法返回所有数据: User::findOne($id); 此方法返回 主键 id=1 的一条数据(举个例子): User::find( ...

  9. springboot mybatis 分页整合

    spring boot 整合mybatis ,分两块mybatis 整合,分页整合.   1.pom文件增加 <dependency> <groupId>org.mybatis ...

  10. 微信小程序组件的使用

    1.在page同级目录下新建components文件夹,然后新建目录test,新建组件test 2.新建在page目录下新建目录,然后新建page页面.注意:每新建一个页面,都要修改app.json文 ...