SQL点点滴滴_非聚集索引设计指南-转载
非聚集索引包含索引键值和指向表数据存储位置的行定位器. 有关非聚集索引体系结构的详细信息, 请参阅 非聚集索引结构.
可以对表或索引视图创建多个非聚集索引. 通常, 设计非聚集索引是为改善经常使用的没有建立聚集索引的查询的性能.
与使用书中索引的方式相似, 查询优化器在搜索数据值时, 先搜索非聚集索引以找到数据值在表中的位置, 然后直接从该位置检索数据. 这使非聚集索引成为完全匹配查询的最佳选择, 因为索引包含说明查询所搜索的数据值在表中的精确位置的项. 例如, 为了从 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点点滴滴_非聚集索引设计指南-转载的更多相关文章
- SQL点点滴滴_聚集索引设计指南-转载
聚集索引基于数据行的键值在表内排序和存储这些数据行, 每个表只能有一个聚集索引, 因为数据行本身只能按一个顺序存储. 有关聚集索引体系结构的详细信息, 请参阅 聚集索引结构. 每个表几乎都对列定义聚集 ...
- SQL Server的非聚集索引中会存储NULL吗?
原文:SQL Server的非聚集索引中会存储NULL吗? SQL Server的非聚集索引中会存储NULL吗? 这是个很有意思的问题,下面通过如下的代码,来说明,到底会不会存储NULL. --1.建 ...
- SQL点点滴滴_唯一索引设计指南-转载
唯一索引能够保证索引键中不包含重复的值, 从而使表中的每一行从某种方式上具有唯一性, 只有当唯一性是数据本身的特征时, 指定唯一索引才有意义. 例如, 如果您希望确保 HumanResources.E ...
- SQL SERVER大话存储结构(2)_非聚集索引如何查找到行记录
如果转载,请注明博文来源: www.cnblogs.com/xinysu/ ,版权归 博客园 苏家小萝卜 所有.望各位支持! 1 行记录如何存储 这里引入两个 ...
- 程序员眼中的 SQL Server-非聚集索引能给我们带来什么?
写在前面 最近在做的一个项目,页面访问的时候很慢(大概几秒钟的样子),然后用日志记录的方式,来排查这个问题,最后发现是 Entity Framework 初始化的一个坑(大概要花 6-7 秒),详见: ...
- SQL Server临界点游戏——为什么非聚集索引被忽略!
当我们进行SQL Server问题处理的时候,有时候会发现一个很有意思的现象:SQL Server完全忽略现有定义好的非聚集索引,直接使用表扫描来获取数据.我们来看看下面的表和索引定义: CREATE ...
- 探究SQL添加非聚集索引,性能提高几十倍之谜
上周,技术支持反映:客户的一个查询操作需要耗时6.1min左右,在跟进代码后,简化了数据库的查询后仍然收效甚微.后来,技术总监分析了sql后,给其中的一个表添加的一个非聚集索引(三个字段)后,同样的查 ...
- SQL Server索引进阶:第二级,深入非聚集索引
原文地址: Stairway to SQL Server Indexes: Level 2, Deeper into Nonclustered Indexes 本文是SQL Server索引进阶系列( ...
- SQL Server索引 (原理、存储)聚集索引、非聚集索引、堆 <第一篇>
一.存储结构 在SQL Server中,有许多不同的可用排列规则选项. 二进制:按字符的数字表示形式排序(ASCII码中,用数字32表示空格,用68表示字母"D").因为所有内容都 ...
随机推荐
- 整理的最全 python常见面试题
整理的最全 python常见面试题(基本必考)① ②③④⑤⑥⑦⑧⑨⑩ 1.大数据的文件读取: ① 利用生成器generator: ②迭代器进行迭代遍历:for line in file; 2.迭代 ...
- SQL语句exists用法
首先头脑中有三点概念: 1 . EXISTS子查询找到的提交 NOT EXISTS 子查询中 找不到的提交 说明:不要去翻译为存在和不存在,把脑袋搞晕. 2 . 建立程序循环的概念,这是一个动态的查 ...
- java转pdf(html转为pdf),解决中文乱码,标签不规范等问题
第一步,下载jar包以及建对应的文件夹.注意pd4ml的jar要选择pro版本.然后建一个pd4fonts.properties 里面对应的字体. SimSun = simsun.ttf 前面为变量名 ...
- SpringCloud---API网关服务---Spring Cloud Zuul
1.概述 1.1 微服务架构出现的问题 及 解决: 1.1.1 前言 每个微服务应用都提供对外的Restful API服务,它通过F5.Nginx等网络设备或工具软件实现对各个微服务的路由与负载 ...
- google +ubuntu16.04
1.在终端中输入以下命令 sudo wget https://repo.fdzh.org/chrome/google-chrome.list -P /etc/apt/sources.list.d/ 2 ...
- An internal error occurred during: "Initializing Java Tooling". Eclipse启动发生的错误
An internal error occurred during: “Initializing Java Tooling” 错误经常是莫名其妙的出现这种总错误,解决办法: 1.eclipse -&g ...
- gemspec和Gemfile的不同角色作用
[原文] http://yehudakatz.com/2010/12/16/clarifying-the-roles-of-the-gemspec-and-gemfile/ 我的翻译 http ...
- 使用git配合idea使用oschina代码仓库初级教程
http://git.oschina.net/ 这个是开源中国的代码仓库是免费的,可以建100和仓库,私有也是免费的 第一步,创建 oschina代码仓库,这里就忽略了.很简单.去注册一个简单几步就可 ...
- php 内存共享shmop源码阅读
多进程通信的时候,会涉及到共享内存.shmop_open()创建或打开一个内存块 PHP_FUNCTION(shmop_open) { long key, mode, size; struct php ...
- 实现JS继承的几种方法
总的来说,JS的继承大体上分为两种:借用构造函数方式和原型方式 首先,我们来看看借用构造函数方式的几种做法: //方式一function Person(name, sex){ this.name = ...