(语法基础)浅谈sql server汇集索引与非汇集索引

今天同事的服务程序在执行批量插入数据操做时,会超时失败,代码debug了几遍一点问题都没有,SQL单条插入也能够正常录入数据,调试了一上午仍是很迷茫,场面一度很尴尬,最后仍是发现了问题的根本,原来是这个同事为了提高查询效率滥用了索引在搞鬼,没有合理的运用索引使每次新增和修改数据时效率极低,大批量插入和修改数据时会使服务器超时。数据库

因此我也简单的对索引相关的知识简单的作了一些总结,我查阅整理了一下在数据的管理中有以下可用的索引:
服务器

索引类型 描述
1,哈希:借助于哈希索引,可经过内存中的哈希表来访问数据。 哈希索引的内存用量固定不变,是存储桶数量的函数。数据结构

2,内存优化非汇集索引: 对于内存优化的非汇集索引,内存使用量依赖于行计数以及索引键列的大小函数

3,群集: 汇集索引基于汇集索引键按顺序排序和存储表或视图中的数据行。 汇集索引按 B 树索引结构实现,B 树索引结构支持基于汇集索引键值对行进行快速检索。性能

4,非汇集 :既可使用汇集索引来为表或视图定义非汇集索引,也能够根据堆来定义非汇集索引。 非汇集索引中的每一个索引行都包含非汇集键值和行定位符。 此定位符指向汇集索引或堆中包含该键值的数据行。 索引中的行按索引键值的顺序存储,可是不保证数据行按任何特定顺序存储,除非对表建立汇集索引。学习

5,惟一: 惟一索引确保索引键不包含重复的值,所以,表或视图中的每一行在某种程度上是惟一的。惟一性能够是汇集索引和非汇集索引的属性。优化

6,columnstore: 内存中列存储索引经过使用基于列的数据存储和基于列的查询处理来存储和管理数据。列存储索引适合于主要执行大容量加载和只读查询的数据仓库工做负荷。 与传统面向行的存储方式相比,使用列存储索引存档可最多提升 10 倍查询性能 ,与使用非压缩数据大小相比,可提供多达 7 倍数据压缩率 。spa

7,带有包含列的索引: 一种非汇集索引,它扩展后不只包含键列,还包含非键列。 debug

8,计算列上的索引: 从一个或多个其余列的值或某些肯定的输入值派生的列上的索引。设计

9,筛选: 一种通过优化的非汇集索引,尤为适用于涵盖从定义完善的数据子集中选择数据的查询。 筛选索引使用筛选谓词对表中的部分行进行索引。 与全表索引相比,设计良好的筛选索引能够提升查询性能、减小索引维护开销并可下降索引存储开销。

10,空间 :利用空间索引,能够更高效地对几何数据类型的列中的空间对象( 空间数据 )执行某些操做。 空间索引可减小须要应用开销相对较大的空间操做的对象数。

11,XML xml 数据类型列中 XML 二进制大型对象 (BLOB) 的已拆分持久表示形式。

12,全文: 一种特殊类型的基于标记的功能性索引,由 Microsoft SQL Server全文引擎生成和维护。 用于帮助在字符串数据中搜索复杂的词。

不难看出要搞清楚全部索引,并灵活的去应用它其实并非一件容易的事情,不少索引咱们甚至都在工做中没用过,甚至没据说过,也不用担忧,能够先大体的了解它,能够在须要实际用到时再去学习也不迟。

不过索引虽多,不用个个深刻学习,我的认为搞懂汇集索引和非汇集索引的基本概念仍是颇有必要的,由于在实际的优化查询,修改,插入等操做时,这两个概念用的最多的,也是最基础的

1,什么是索引?

索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。若是想按特定职员的姓来查找他或她,则与在表中搜索全部的行相比,索引有助于更快地获取信息。最多见的索引就是书的目录

2,如何理解汇集索引和非汇集索引

概念:

  汇集索引是指数据库表行中数据的物理顺序与键值的逻辑(索引)顺序相同。

  非汇集索引是一种索引,该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不一样。

上面是资料概念的概述,在讲讲我本身对汇集索引和非汇集索引的理解:

  汇集索引最现实的能够体现的例子就是字典的拼音查询,通常咱们经常使用的中文字典会将字典的每一个字按照abcd...的拼音顺序去排列,字典中的每个字比如是一条条数据,而字典最前面更具拼音查询指定字的页码的小目录就是索引,目录拼音排序和实际数据顺序是相同的,也就是所谓的数据库表行中数据的物理顺序与键值的逻辑(索引)顺序相同。

  那非汇集索引勒?非汇集索引其实最现实的体现也是字典,只不过换成了字典的部首查询的体现,咱们看看部首查询和拼音查询有何区别,不难发现,从部首排序的角度去看,发现字典中字典中实际的字实际数据)排列顺序是没有任何部首排列规则的,可是查询部首的目录(索引)都是按照指定的部首规则排序的,这样的好处能够在插入和更新的数据的时候没必要从新排列数据,这就是所谓的索引中索引的逻辑顺序与磁盘上行的物理存储顺序不一样。

汇集索引和非汇集索引均可以优化查询,我在此处只是浅显的从,概念的角度去谈对两个简单索引的理解,但愿对你们有用,实际索引的原理仍是比较复杂的,须要深刻全部索引的原理我的建议仍是从数据结构入手

附:

  • 群集

    • 汇集索引根据数据行的键值在表或视图中排序和存储这些数据行。 索引定义中包含汇集索引列。 每一个表只能有一个汇集索引,由于数据行自己只能按一个顺序存储。

    • 只有当表包含汇集索引时,表中的数据行才按排序顺序存储。 若是表具备汇集索引,则该表称为汇集表。 若是表没有汇集索引,则其数据行存储在一个称为堆的无序结构中。

  • 非汇集

    • 非汇集索引具备独立于数据行的结构。 非汇集索引包含非汇集索引键值,而且每一个键值项都有指向包含该键值的数据行的指针。

    • 从非汇集索引中的索引行指向数据行的指针称为行定位器。 行定位器的结构取决于数据页是存储在堆中仍是汇集表中。 对于堆,行定位器是指向行的指针。 对于汇集表,行定位器是汇集索引键。

    • 能够向非汇集索引的叶级添加非键列以跳过现有的索引键限制,并执行完整范围内的索引查询。

汇集索引和非汇集索引均可以是惟一的。 这意味着任何两行都不能有相同的索引键值。 另外,索引也能够不是惟一的,即多行能够共享同一键值。 

每当修改了表数据后,都会自动维护表或视图的索引。

汇集索引的缺点是对表进行修改速度较慢,这是为了保持表中的记录的物理顺序与索引的顺序一致,而把记录插入到数据页的相应位置,必须在数据页中进行数据重排,下降了执行速度。非汇集索引指定了表中记录的逻辑顺序,但记录的物理顺序和索引的顺序不一致,汇集索引和非汇集索引都采用了B+树的结构,但非汇集索引的叶子层并不与实际的数据页相重叠,而采用叶子层包含一个指向表中的记录在数据页中的指针的方式。非汇集索引比汇集索引层次多,添加记录不会引发数据顺序的重组。

相关文章
相关标签/搜索