非聚集索引包含索引键值和指向表数据存储位置的行定位器. 有关非聚集索引体系结构的详细信息, 请参阅 非聚集索引结构.

可以对表或索引视图创建多个非聚集索引. 通常, 设计非聚集索引是为改善经常使用的没有建立聚集索引的查询的性能.

与使用书中索引的方式相似, 查询优化器在搜索数据值时, 先搜索非聚集索引以找到数据值在表中的位置, 然后直接从该位置检索数据. 这使非聚集索引成为完全匹配查询的最佳选择, 因为索引包含说明查询所搜索的数据值在表中的精确位置的项. 例如, 为了从 Person.Person 表中查询具有特定姓氏的人员, 查询优化器可能使用非聚集索引 IX_Person_LastName_FirstName_MiddleName;它以 LastName 作为自己的一个键列. 查询优化器能快速找出索引中与指定 LastName 匹配的所有项, 每个索引项都指向表或聚集索引中准确的页和行, 其中可以找到相应的数据. 在查询优化器在索引中找到所有项之后, 它可以直接转到准确的页和行进行数据检索.


数据库注意事项

设计非聚集索引时需要注意数据库的特征.

  • 更新要求较低但包含大量数据的数据库或表可以从许多非聚集索引中获益从而改善查询性能. 与全表非聚集索引相比, 考虑为定义完善的数据子集创建筛选索引可以提高查询性能, 降低索引存储开销并减少索引维护开销.

    决策支持系统应用程序和主要包含只读数据的数据库可以从许多非聚集索引中获益, 查询优化器具有更多可供选择的索引用来确定最快的访问方法, 并且数据库的低更新特征意味着索引维护不会降低性能.

  • 联机事务处理应用程序和包含大量更新表的数据库应避免使用过多的索引. 此外, 索引应该是窄的, 即列越少越好.

    一个表如果建有大量索引会影响 INSERT,UPDATE,DELETE 和 MERGE 语句的性能,因为当表中的数据更改时,所有索引都须进行适当的调整.


查询注意事项

在创建非聚集索引之前, 应先了解访问数据的方式, 考虑对具有以下属性的查询使用非聚集索引:

  • 使用 JOIN 或 GROUP BY 子句.

    应为联接和分组操作中所涉及的列创建多个非聚集索引, 为任何外键列创建一个聚集索引.

  • 不返回大型结果集的查询.

    创建筛选索引以覆盖从大型表中返回定义完善的行子集的查询.

  • 包含经常包含在查询的搜索条件(例如返回完全匹配的 WHERE 子句)中的列.


列注意事项

考虑具有以下一个或多个属性的列:

  • 覆盖查询

    当索引包含查询中的所有列时, 性能可以提升, 查询优化器可以找到索引内的所有列值, 不会访问表或聚集索引数据, 这样就减少了磁盘 I/O 操作. 使用具有包含列的索引来添加覆盖列, 而不是创建宽索引键. 有关详细信息, 请参阅 具有包含列的索引

    如果表有聚集索引, 则该聚集索引中定义的列将自动追加到表上每个非聚集索引的末端, 这可以生成覆盖查询, 而不用在非聚集索引定义中指定聚集索引列. 例如, 如果一个表在 C 列上有聚集索引, 则 B 和 A 列的非聚集索引将具有其自己的键值列 B、A 和 C.

  • 大量非重复值, 如姓氏和名字的组合(前提是聚集索引被用于其他列).

    如果只有很少的非重复值, 例如仅有 1 和 0, 则大多数查询将不使用索引, 因为此时表扫描通常更有效. 对于这种类型的数据, 应考虑对仅出现在少数行中的非重复值创建筛选索引. 例如, 如果大部分值都是 0, 则查询优化器可以对包含 1 的数据行使用筛选查询.


索引选项

在创建非聚集索引时, 可以指定若干索引选项, 要尤其注意以下选项:

  • FILLFACTOR

  • ONLINE

有关详细信息, 请参阅 设置索引选项

SQL点点滴滴_非聚集索引设计指南-转载的更多相关文章

  1. SQL点点滴滴_聚集索引设计指南-转载

    聚集索引基于数据行的键值在表内排序和存储这些数据行, 每个表只能有一个聚集索引, 因为数据行本身只能按一个顺序存储. 有关聚集索引体系结构的详细信息, 请参阅 聚集索引结构. 每个表几乎都对列定义聚集 ...

  2. SQL Server的非聚集索引中会存储NULL吗?

    原文:SQL Server的非聚集索引中会存储NULL吗? SQL Server的非聚集索引中会存储NULL吗? 这是个很有意思的问题,下面通过如下的代码,来说明,到底会不会存储NULL. --1.建 ...

  3. SQL点点滴滴_唯一索引设计指南-转载

    唯一索引能够保证索引键中不包含重复的值, 从而使表中的每一行从某种方式上具有唯一性, 只有当唯一性是数据本身的特征时, 指定唯一索引才有意义. 例如, 如果您希望确保 HumanResources.E ...

  4. SQL SERVER大话存储结构(2)_非聚集索引如何查找到行记录

              如果转载,请注明博文来源: www.cnblogs.com/xinysu/   ,版权归 博客园 苏家小萝卜 所有.望各位支持!      1 行记录如何存储     这里引入两个 ...

  5. 程序员眼中的 SQL Server-非聚集索引能给我们带来什么?

    写在前面 最近在做的一个项目,页面访问的时候很慢(大概几秒钟的样子),然后用日志记录的方式,来排查这个问题,最后发现是 Entity Framework 初始化的一个坑(大概要花 6-7 秒),详见: ...

  6. SQL Server临界点游戏——为什么非聚集索引被忽略!

    当我们进行SQL Server问题处理的时候,有时候会发现一个很有意思的现象:SQL Server完全忽略现有定义好的非聚集索引,直接使用表扫描来获取数据.我们来看看下面的表和索引定义: CREATE ...

  7. 探究SQL添加非聚集索引,性能提高几十倍之谜

    上周,技术支持反映:客户的一个查询操作需要耗时6.1min左右,在跟进代码后,简化了数据库的查询后仍然收效甚微.后来,技术总监分析了sql后,给其中的一个表添加的一个非聚集索引(三个字段)后,同样的查 ...

  8. SQL Server索引进阶:第二级,深入非聚集索引

    原文地址: Stairway to SQL Server Indexes: Level 2, Deeper into Nonclustered Indexes 本文是SQL Server索引进阶系列( ...

  9. SQL Server索引 (原理、存储)聚集索引、非聚集索引、堆 <第一篇>

    一.存储结构 在SQL Server中,有许多不同的可用排列规则选项. 二进制:按字符的数字表示形式排序(ASCII码中,用数字32表示空格,用68表示字母"D").因为所有内容都 ...

随机推荐

  1. CSS中margin属性

    css中margin块级元素的垂直相邻外边距会合并,比如 方框的上下外边距并不是2px,而是合并为1px了. 设置float属性就可以避免这种同级元素边距合并

  2. 修改linux系统用户、PostgreSQL用户的密码

    1. 修改linux系统postgres用户的密码 PostgreSQL会创建一个默认的linux用户postgres,修改该用户密码的方法如下: 步骤一:删除用户postgres的密码 sudo   ...

  3. 案例19-页面使用ajax显示类别菜单

    1 版本一 版本只能在首页显示类别,当切换到了其它页面就不会显示 1 web层IndexServlet代码 package www.test.web.servlet; import java.io.I ...

  4. r.js 配置文件 example.build.js 不完整注释

    /* * This is an example build file that demonstrates how to use the build system for * require.js. * ...

  5. idea 下 启动maven项目,mybatis报错 Error parsing SQL Mapper Configuration. Cause: java.io.IOException。。。。。

    我的具体报错日志是   Error parsing SQL Mapper Configuration. Cause: java.io.IOException  Could not find resou ...

  6. android和Linux下getopt的差别

    1. Linux下如果找不到相对应的参数,则会跳过继续找下一个 Android下如果找不到则会直接返回-1,跳出来 2. Linux下通过getopt后会把找到的元素放到数组的前面,没找到的往后移动( ...

  7. [SpringBoot系列]--Spring Hibernate search 注解实现(未测试)

    1.maven项目pom.xml加入依赖 <dependency> <groupId>org.hibernate</groupId> <artifactId& ...

  8. NPM 与前端包管理

    我们很清楚,前端资源及其依赖管理一直是 npm 的重度使用场景,同时这也一直是 Node.js 普及的重要推动力.但这类应用场景到底有多重度?这是一个很难回答的问题.这份 “npm 最常下载的包的清单 ...

  9. AngularJS中的动画实现

    AngularJS 动画 AngularJS 提供了动画效果,可以配合 CSS 使用. AngularJS 使用动画需要引入 angular-animate.min.js 库. <script ...

  10. Splunk数据处理

    0.提要 本篇主要从技术层面针对Splunk Enterprise中关于数据处理的概念.过程与部件进行了概要性总结. 1.数据管理基本概念 索引(index):Splunk用于存储事件的数据仓库: 索 ...