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").因为所有内容都 ...
随机推荐
- iview tree 之如何获取已勾选的节点
1.记得添加 ref 2.用 this.$refs.tree.getCheckNodes()
- 封装通用的xhr对象(兼容各个版本)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 关于DES加密内部收费版
数据加密算法(Data Encryption Algorithm,DEA)是一种对称加密算法,很可能是使用最广泛的密钥系统,特别是在保护金融数据的安全中,最初开发的DEA是嵌入硬件中的.通常,自动取款 ...
- vue-router学习
JS push goTo(){ , postId: ' }}) } router.js // 动态路径参数 以冒号开头 { path: '/user/:id', component: User } { ...
- ubuntu 18 常用软件安装
主要内容 1.安装 Ubuntu 18.04 LTS 2.安装 Google Chrome 3.安装 OpenVPN Client 4.安装 Docker CE 5.安装 MySQL Server 转 ...
- 如何使一个div能够铺满整个页面? && 模态框的制作 && outerHTML
说明: 使用 ele.outerHTML = '' 这样的方法可以很容易的清除一个元素. 当然也可以使用parent.removeChild() ,但是相较而言,还是使用 outerHTML = '' ...
- Oracle 事务操作
在看本文之前,请确保你已经了解了Oracle事务和锁的概念即其作用,不过不了解,请参考数据库事务的一致性和原子性浅析和Oracle TM锁和TX锁 1.提交事务 当执行使用commit语句可以提交事务 ...
- JVM的内存结构
程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器.字节码解释器工作时就是通过改变这个计数器的值来选取下一条 ...
- ckeditor添加代码插入功能及高亮显示(插件)
Auto SyntaxHighlighter SyntaxHighlighter CKEditor Button 下载以上两个插件,启用 以下可有可无: (设置在编辑器的显示样式) ckeditor高 ...
- FocusBI: 数据仓库 (原创)
关注微信公众号:FocusBI 查看更多文章:加QQ群:808774277 获取学习资料和一起探讨问题. <商业智能教程>pdf下载地址 链接:https://pan.baidu.com/ ...