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

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

与使用书中索引的方式相似, 查询优化器在搜索数据值时, 先搜索非聚集索引以找到数据值在表中的位置, 然后直接从该位置检索数据. 这使非聚集索引成为完全匹配查询的最佳选择, 因为索引包含说明查询所搜索的数据值在表中的精确位置的项. 例如, 为了从 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. Postman学习(压力测试)

    Postman下载安装后 下面是在网上随便抓了一个请求地址来做演示,把请求地址填入地址栏,此请求为GET请求.点击Send发送请求,请求结果将会在下方显示出来.每次的请求历史数据,会被记录下来,但是经 ...

  2. Linux C代码 获取IP地址

    Ubuntu 16.04下,可编译通过: #include <stdio.h> #include <ifaddrs.h> #include <arpa/inet.h> ...

  3. Fiddler模拟发送post请求

    fiddler在进行接口测试时,会模拟post请求,发送不同的请求参数,返回不同的结果,今天我们就来分享一下,怎么用Fiddler工具模拟post请求: 打开Fiddler工具,在右侧点击“compo ...

  4. 【Docker】Dockerfile使用apt-get来安装jdk

    前面谈过使用wget来从oracle下载jdk安装文件是使用了cookie欺骗的方法来越过身份验证来使用Dockerfile在ubuntu内安装oracle版本的jdk的. 然而正道还是用apt-ge ...

  5. 【javascript】onload load ready的那些事

    首先明确一下页面加载的步骤: 1.下载解析HTML文档结构 2.加载外部脚本文件与样式表文件 3.解析并执行脚本代码 4.构造HTML DOM模型 5 .加载图片等外部文件 6.页面加载完毕 接下来, ...

  6. 3、在Shell程序中使用的参数

    学习目标位置参数内部参数 如同ls命令可以接受目录等作为它的参数一样,在Shell编程时同样可以使用参数.Shell程序中的参数分为位置参数和内部参数等. 12-3-1 位置参数由系统提供的参数称为位 ...

  7. MySQL的优化(大纲)

    参考:http://www.cnblogs.com/villion/archive/2009/07/23/1893765.html#3031899 MySQL的优化,主要可以考虑以下四方面: 1.数据 ...

  8. 巧用hover改变css样式和背景

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. webpack+react

    一直提醒我这个.闹心最后发现是在不同的js 里引入组件的时候 import React from 'react'; 和 import React from 'React'; 就是大小写的问题. 解决办 ...

  10. Redis - 数据类型常用命令

    5种数据类型都离不开key,先列出key的相关命令. KEY相关操作 列出符合规则的KEYS KEYS pattern pattern支持glob风格的通配符格式,即: ? 一个字符 * 任意多个字符 ...