索引访问方法及索引优化
要了解索引访问方法,首先要知道索引的结构。
1.表和索引的结构
页
页是sql server存储数据的基本单位,大小为8kb,可以存储表数据、索引数据、执行计划数据、分配位图、可用空间信息。页是sql server可以读写的最小I/O单位。即便是读取一行数据,它也要把整个页加载到缓存并从缓存中读取数据。
区
区是由8个连续页组成的分配单元。
堆
堆是指不含聚集索引的表,它的数据不按任何顺序进行存储。
联系一个堆中的数据的唯一结构是被称为索引分配映射(IAM)的一个位图页,当扫描对象时,SQl server使用IAM页来遍历该对象的数据。
聚集索引:
它的叶级表中维护所有数据,按照索引键列的顺序存储在索引的叶级。在索引页级别的上层,索引还维护着其他级别,每个级别都概况了它下面的级别,非叶级索引上的每一行指向它下一级别的整个页。
堆上的非聚集索引:
与聚集索引的唯一区别是非聚集索引的叶级页只包含索引键列和指向特定数据行的行定位符,称为RID。当通过索引查找到特定的数据行后,Sqlserver必须在seek操作之后执行RID lookup操作,该操作用于读取包含数据行的页。
聚集表上的非聚集索引:
指向特定数据行的行定位符是聚集键的值,不是RID。
2.索引访问方法
表扫描/无序聚集索引扫描
当表中没有索引时,连续的扫描表中的所有数据页。SQl server将根据该表的IAM页指示磁盘取数臂按物理顺序扫描属于该表的区。
当表包含聚集索引时,所采取的方法将是无序聚集索引扫描。
示例sql:select orderid,custid,empid,shipperid,orderdate,filler from dbo.Orders
索引:CREATE CLUSTERED INDEX idx_cl_od ON dbo.Orders(orderdate);
表Orders结构: orderid,custid,empid,shipperid,orderdate,filler
覆盖非聚集索引扫描
Sql server 只访问索引数据就可以找到满足查询所需的全部数据,不需要访问完整的数据行。
示例sql:select orderid from dbo.Orders
索引:ALTER TABLE [dbo].[Orders] ADD CONSTRAINT [PK_Orders] PRIMARY KEY NONCLUSTERED
(
[orderid] ASC
)
有序聚集索引扫描
按照链接列表对聚集索引叶级执行的完整扫描 操作。
示例sql:select orderid,custid,empid,shipperid,orderdate,filler from dbo.Orders order by orderdate
索引:
CREATE CLUSTERED INDEX idx_cl_od ON dbo.Orders(orderdate);
不同于无序索引扫描,有序扫描的性能取决于索引的碎片级别。
有序覆盖非聚集索引扫描
与有序聚集索引扫描类似,但是覆盖非聚集索引扫描时,因为它涉及更少的页,它的成本肯定比聚集索引索引扫描要低。
示例sql:select orderid, orderdate from dbo.Orders order by orderid
非聚集索引索引查找+有序局部扫描+lookups
通常用于小范围查询,且用到的非聚集索引没有覆盖该查询。
示例sql:select orderid,custid,empid,shipperid,orderdate,filler from dbo.Orders where orderid between 101 and 200
无序非聚集索引扫描 + lookups
通常符合以下情况时,优化器会选择此种访问方法:
- 该查询的选择性足够高
- 最适合某查询的索引并不覆盖该查询
- 索引没有按顺序维护被查找键
示例sql:select orderid,custid,empid,shipperid,orderdate,filler from dbo.Orders where custid = ‘’
聚集索引查找+有序局部扫描
对于按聚集索引的第一个键列进行筛选的范围查询,优化器通常使用这种方法。
示例sql:select orderid,custid,empid,shipperid,orderdate,filler from dbo.Orders where orderdate = ‘20060212’
这种方法的好处是不涉及lookups.
覆盖非聚集索引查找+有序局部扫描
访问方法与上一个类似,唯一的区别是非聚集索引。相对于上一个访问方法,这个方法的好处在于非聚集索引的的叶级页比聚集索引的叶级页能够容纳更多的行。
示例sql: select shipperid,orderdate, custid from dbo.Orders
Where shipperid='C' and orderdate >='20060101' and orderdate <'20070101'
CREATE NONCLUSTERED INDEX idx_nc_sid_od_cid
ON dbo.Orders(shipperid, orderdate, custid);
3.索引优化等级
需要优化的sql:select orderid,custid,empid,shipperid,orderdate,filler from dbo.Orders where orderid > 999001
1.这个表没有任何索引:该计划将使用表扫描
2.接下来优化,创建一个非聚集覆盖索引,且不把筛选列(orderid)作为第一个筛选列:
CREATE INDEX idx_nc_od_i_oid_cid_eid_sid
ON performance.dbo.Orders(orderdate)
include(orderid,custid,empid,shipperid);
优化器将采用覆盖非聚集索引扫描
3.下一步优化:创建一个不覆盖该查询的非聚集索引
CREATE NONCLUSTERED INDEX idx_nc_od_i_oid
ON dbo.Orders(orderdate)
INCLUDE(orderid);
优化器将采用非聚集索引扫描+lookup,这个查询依赖于选择性。选择性越高,性能越高。
4.继续优化:在orderid上创建非聚集非覆盖索引,
CREATE UNIQUE NONCLUSTERED INDEX idx_unc_oid
ON dbo.Orders(orderid);
优化器将采用非聚集索引查找+lookup
5.继续优化:在orderid上创建聚集索引
CREATE UNIQUE CLUSTERED INDEX idx_cl_oid ON dbo.Orders(orderid);
这个计划主要不涉及lookup,
6.继续优化:
最佳优化应该是把orderid作为键列,并把其他列定义为包含性非键列的非聚集覆盖索引。
CREATE UNIQUE NONCLUSTERED INDEX idx_unc_oid_i_od_cid_eid_sid
ON dbo.Orders(orderid)
INCLUDE(orderdate, custid, empid, shipperid);
这个计划的逻辑与上一个类似,只是非聚集覆盖索引有序局部扫描读取的页更少。
转载于:https://www.cnblogs.com/sand-tiny/p/3946006.html
索引访问方法及索引优化相关推荐
- MySQL索引使用方法和性能优化
关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车.对于没有索引的表,单表查询可能几十万数据就是瓶颈,而通常大型 ...
- ORACLE索引重建方法与索引的三种状态
一.重建索引的前提 1.表上频繁发生update,delete操作: 2.表上发生了alter table ..move操作(move操作导致了rowid变化). 二.重建索引的标准 1.索引重建是否 ...
- mysql 普通索引使用方法,Mysql索引类型与基本用法实例分析
本文实例讲述了Mysql索引类型与基本用法.分享给大家供大家参考,具体如下: 索引 MySQL目前主要有以下几种索引类型: 普通索引 唯一索引 主键索引 组合索引 全文索引 - 普通索引 是最基本的索 ...
- 【Java 虚拟机原理】Class 字节码二进制文件分析 五 ( 方法计数器 | 方法表 | 访问标志 | 方法名称索引 | 方法返回值类型 | 方法属性数量 | 方法属性表 )
文章目录 前言 一.方法表结构 二.方法计数器 三.方法表数据解析 ( init 构造方法 ) 1.方法访问标志 2.方法名称索引 3.方法返回类型 4.方法属性数量 前言 上一篇博客 [Java 虚 ...
- MySQL 索引 :哈希索引、B+树索引、最左前缀匹配规则、全文索引
文章目录 索引 什么是索引 索引优缺点与适用场景 常见的索引 哈希索引 自适应哈希索引 B+树索引 聚集索引 非聚集索引 使用方法 联合索引 最左前缀匹配规则 覆盖索引 全文索引 使用方法 索引 什么 ...
- MySQL 索引 :哈希索引、B+树索引、全文索引
文章目录 索引 引言 常见的索引 哈希索引 自适应哈希索引 B+树索引 聚集索引 非聚集索引 使用方法 联合索引 最左前缀匹配规则 覆盖索引 全文索引 使用方法 索引 引言 为什么需要索引? 倘若不使 ...
- 操作系统中的文件系统和访问方法
文件 (File) A file is basically a sequence of bytes organized into blocks that are understandable by a ...
- 《DBNotes:single_table访问方法、MRR多范围读取优化、索引合并》
目录 single_table访问方法 const ref ref_or_null range index all MRR多范围读取优化 索引合并 intersection union sort-un ...
- Oracle索引梳理系列(九)- 浅谈聚簇因子对索引使用的影响及优化方法
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
最新文章
- sql server 常见约束
- Centos MySQL 5.7安装、升级教程
- android 入门 006(sqlite增删改查)
- 2019春第一次课程设计实验报告
- jvm性能调优 - 08什么情况下对象会被GC
- canvas学习之粒子动画
- Java初学者的学习思路与建议
- CCPC-Wannafly Winter Camp Day8 (Div2, onsite) 补题
- UVALive 6885	 Flowery Trails 最短路枚举
- 单纯形法只有两个约束条件_教学 | 线性规划 7 :单纯形法的引入
- python零基础入门教程-零基础入门Python爬虫不知道怎么学?这是入门的完整教程...
- php while循环语句格式,PHP while 循环
- 金笛JDMAIL打造公务员邮件系统
- Android插件化实现方案
- c++如何生成一个不能被继承的类
- java第二个月月考_java月考题JSD1908第二次月考(含答案和解析)
- Android 内外边距
- 【解决方案】VR视频行业急速发展,如何搭建一套16K高清的公网视频传输系统?
- 苹果描述文件无法连接服务器,教你 game center无法连接服务器解决办法及iOS9.3.2公测版已修复GameCenter无响应bug...
- vue阻止浏览器默认事件
热门文章
- 牛客练习赛25 因数个数和
- HDU Problem - 4280 Island Transport(最大流)
- kafka 报错:kafka server:Message was too large ,server rejected it to avoid allocation
- tensorflow 之 最近用到的几个小操作tf.reshape,tf.convert_to_tensor,tf.where
- [攻防世界 pwn]——hello_pwn
- Eclipse console 中文乱码解决
- Excel共享工作簿
- MySQL Connector / Python
- Leetcode 147.对链表进行排序
- 找新朋友(欧拉函数)