【SQL Server】系统学习之二:索引优化
页大小8192个字节,行限制为8060字节(大型对象除外)。
包含varchar nvarchar varbinary sql_variant(8012,object类型) clr 的行,如果行大小超过8060,最大的上述列,被移动到行溢出分配单元。如果列超过8000,还会被存储为大型对象。
分配单元:IN_ROW_DATA
Row_OVERFLOW_DATA
LOB_DATA
分配顺序扫描:基于IAM页(索引分配映射)
一个IAM只能映射某一个表分区的某一种类型的页面,并且最多覆盖4GB的大小。比如:一个表有四个分区,每个分区都包含三种类型的数据(in-row, LOB, and row-overflow),那它最少会有4*3 = 12 个IAM页面,若个任何一个分区的任何一种数据类型超过4G或任意一个表分区跨越多个文件,就需要更多的IAM。
索引顺序扫描
索引碎片:分配新页,把大约一半的行的移动到新页,在根据键值将新行插入到新页或旧页,并调整链表,以反映正确的逻辑顺序。例外是新行键值是最大的,将直接分配新页,避免过多的页拆分。
索引的级数:indexproperty
索引查找是随机IO,为每行lookup一次,都是读取一个页(堆)或 N个页(聚集表,索引N级)
非聚集索引包括:数据副本,行定位符【堆的RID(文件号-页号-行号),聚集表中的KeyID(聚集索引键值和唯一标示符)】
===============================影响查询速度的重点是磁盘臂的摆动
select indexproperty(object_id('new_FollowRecords'),'PK_new_FollowRecords','IndexDepth')
查询方法:
1、表扫描
对无聚集索引的堆表,分配顺序扫描,逻辑读取次数等于该表使用的页数
2、无序聚集索引扫描
表包含聚集索引,且查询时未指定索引排序操作
3、无序覆盖非聚集索引扫描
插播:2、3会根据数据一致性和性能选择分配顺序扫描和索引顺序扫描
a、索引非常小(小于64页)时,解释IAM页的开销成为主要开销,会使用索引顺序扫描
b、小表(?不知道多大算小),优先选择分配顺序扫描
c、索引大小超过64页;未提交读隔离级别;使用分配顺序扫描(不要求数据一致性)
d、索引大小超过64页,更高的隔离级别,但是知道不允许对数据进行修改(例如使用tablock,例如只读的文件组、数据库)
4、有序聚集索引扫描
索引顺序扫描
5、有序覆盖非聚集索引扫描
6、非聚集索引查找+有序局部扫描+lookups
适用于小范围查询或点查询(选择性高),筛选的列是索引的第一个键列。

通过查询计划里的Seek predicates 和Order:True推测,执行了有序局部扫描

7、无序非聚集索引扫描+lookups
当筛选的列不是索引的第一个键列,没办法,只能扫描。
要求同样的,选择性足够高用这种方式,否则过多的lookup必然带来过高的开销。
8、聚集索引查找+有序局部扫描
平凡的计划:不依赖于选择性,不会因为查询的数据量变大,就性能降低。
9、覆盖非聚集索引查找+有序局部扫描
8和9都受索引碎片影响,因为查询开销主要在局部扫描上
索引的覆盖列,仅仅存在于叶级页,当索引顺序改变时,并不会像键列一样跟着被更新。
索引交集:可以看做是按行定位符进行的内连接,从一定程度上缓解创建大量索引所带来的维护开销。
筛选索引:在创建索引时,指定where子句,限定范围,例如xx is not null, a<4000.这样,只会在有限范围内创建索引,开销更小些。
查询索引使用情况:
select * from dm_db_index_usage_stats:查询用户、系统的查找、扫描次数,以及最后一次执行时间,用于分析是否该索引还被使用。
select * from dm_db_index_operational_stats(DB_ID('数据库名'),object_id('表名'),index_id('索引名'),partition_number(分区id)
默认值是null,indexid如果是堆,指定0;
碎片整理:
重新生成:按链表顺序重新生成索引,使页的文件顺序和链表顺序一致。
重新组织:冒泡排序算法,根据索引页在链表中的顺序在磁盘上物理的将页排序。

【SQL Server】系统学习之二:索引优化的更多相关文章
- T-SQL :SQL Server系统数据库(二)
master:master数据库储存实例范围的元数据信息,服务器配置,实例中的所有数据库信息和初始化信息. Resource:Resource数据库是一个隐藏,只读数据库,存储所有系统对象的定义.当查 ...
- Sql Server来龙去脉系列之二 框架和配置
本节主要讲维持数据的元数据,以及数据库框架结构.内存管理.系统配置等.这些技术点在我们使用数据库时很少接触到,但如果要深入学习Sql Server这一章节也是不得不看.本人能力有限不能把所有核心的知识 ...
- 关于SQL SERVER数据库学习总结
对于SQL SERFVER数据库也学了有一阵子了,自己也对自己所学做了一些总结. 我们首先学习数据库设计的一些知识点和用SQL语句建库. 设计数据库步骤:需求分析阶段,概要设计阶段,详细设计阶段, 建 ...
- SQL SERVER深入学习学习资料参考
SQL SERVER深入学习学习资料参考 1.微软Webcast<sql server 2000完结篇>. 尽管微软Webcast出了很多关于Sql Server的系列课程,但是最为深入讲 ...
- SQL Server系统表介绍与使用
关于SQL Server数据库的一切信息都保存在它的系统表格里.我怀疑你是否花过比较多的时间来检查系统表格,因为你总是忙于用户表格.但是,你可能需要偶尔做一点不同寻常的事,例如数据库所有的触发器.你可 ...
- SQL Server系统函数简介[转]
一.字符转换函数1.ASCII()返回字符表达式最左端字符的ASCII 码值.在ASCII()函数中,纯数字的字符串可不用‘’括起来,但含其它字符的字符串必须用‘’括起来使用,否则会出错.2.CHAR ...
- SQL索引管理器 - 用于SQL Server和Azure上的索引维护的免费GUI工具
我作为SQL Server DBA工作了8年多,管理和优化服务器的性能.在我的空闲时间,我想为宇宙和我的同事做一些有用的事情.这就是我们最终为SQL Server和Azure 提供免费索引维护工具的方 ...
- SQL Server 系统数据库
Sql Server的系统数据库分为:master.model.msdb,resouce和tempdb,这五个数据库在SQL Server中各司其职,作为研发人员,很有必要了解这几个数据库的职责,下面 ...
- SQL Server 解读【已分区索引的特殊指导原则】(3) - 非聚集索引分区
一.前言 在MSDN上看到一篇关于SQL Server 表分区的文档:已分区索引的特殊指导原则,如果你对表分区没有实战经验的话是比较难理解文档里面描述的意思.这里我就里面的一些概念进行讲解,方便大家的 ...
- SQL Server 解读【已分区索引的特殊指导原则】(2)- 唯一索引分区
一.前言 在MSDN上看到一篇关于SQL Server 表分区的文档:已分区索引的特殊指导原则,如果你对表分区没有实战经验的话是比较难理解文档里面描述的意思.这里我就里面的一些概念进行讲解,方便大家的 ...
随机推荐
- banner轮播图js
例子1: if(!$('.side_ul ul').is(":animated")){ var wli = $('.side_ul li').width()+ ...
- 网站不能访问(httperrLog【Timer_MinBytesPerSecond】【Timer_ConnectionIdle】)(转载)
在\LogFiles\HTTPERR的日志(C:\Windows\System32\LogFiles\HTTPERR)中发现了大量Timer_MinBytesPerSecond,Timer_Conne ...
- 越狱Season 1-Episode 17: J-Cat
Season 1, Episode 17: J-Cat -Pope: Hey, that's looking good. 嗨,看起来真棒 You're making some real progres ...
- Android dip(dp) 与 sp的自适应问题
本文转载于:http://www.oschina.net/question/272860_70761 今天碰到的一个问题,感觉应该其他人也会碰到,拿来分享一下. 我们都知道android在开发配置界面 ...
- java定时框架:表达式设置
Quartz中时间表达式的设置-----corn表达式 (注:这是让我看比较明白的一个博文,但是抱歉,没有找到原作者,如有侵犯,请告知) 时间格式: <!-- s m h d m w(?) y( ...
- linux日志处理logrotate使用
摘录自:http://linux008.blog.51cto.com/2837805/555829 内容在这里做个备份,以便以后查看: 使用logrotate管理nginx日志文件 2011-04- ...
- 关于C# 中的Attribute 特性
关于C# 中的Attribute 特性 作者: 钢钢 来源: 博客园 发布时间: 2011-01-09 23:30 阅读: 13921 次 推荐: 12 原文链接 [收藏] 摘要:纠结地说 ...
- shell脚本实例-游戏脚本
http://bbs.chinaunix.net/thread-3580033-1-1.html shell游戏收集贴 #!/bin/bash # Tetris Game #APP declarati ...
- VC ++ MFC activex 控件获取连接的VPN 信息
vc++ MFC 进行activex 控件的开发步骤就不用多写了,只是简单的说明一下方法,以及具体的代码: 使用的类库是 windows 系统的 rasapi32.dll 记住需要添加的头文件如下 ...
- document cookie用法
cookie概述 曾经利用一个不变的框架来存储购物栏数据,而商品显示页面是不断变化的,尽管这样能达到一个模拟 全局变量的功能,但并不严谨.例如在导航框架页面内右击,单击快捷菜单中的[刷新]命令,则所有 ...