SQL Server 索引知识-结构,实现
索引的作用毋庸置疑,但他是如何组织,并实现提高语句访问效率的呢?本篇文章为大家做个详细的介绍.
聚集索引架构 B-tree
如图1-1
a.B-tree的结构,叶子节点为数据.数据按照聚集索引键有序排列.
b.每个表只能有一个聚集索引.
c.创建时如果未声明Unique,索引字段有重复值会内部添加唯一标识符(4字节)额外维护
非聚集索引架构 B-tree
如图1-2
a 索引树为B-tree,叶子节点包含索引行内容,并包含指向数据页的书签.当表为堆表时书签为RID(文件号,页号,槽号),用以指向具体数据页进行书签查找.当表为聚集表时书签为聚集索引键,用以指向具体数据页进行键查找.
b 非聚集索引上限个数为999(sql2008)(sql2005为249个)
c 非聚集索引中包含聚集索引键.在包含性列中显示添加不会额外增加存储.
d 如果表为聚集表,则书签为聚集索引,为什么不是RID?
因为聚集表一旦有变动,RID将不再准确,如果根据RID则需额外维护,增加额外成本.
e 查询谓词中有聚集索引时,应显示添加聚集索引未非聚集包含性列
包含性列(include columns)
堆表(heap)
堆表结构.非聚集索引表.数据页由IAM页管理.数据页中每个IAM位图指向一个区.如含有多个IAM页(多数据文件,>4GB),IAM页之间相连
B-tree 索引键值value查找
类似B-tree 索引范围查找(range seek)
a.获取根节点
b.遍历行为查询下边界值找下一层指针
c.继续匹配寻找下一层指针
d.如果没有到达叶子节点,继续b步骤
e.叶子层获取索引行匹配数据(值大于等于下边界值)
f.当到达上边界值时退出.
g.如果页中查找到索引行底部,根据指针获得其他页然后执行e
B-tree 区域扫描(range scan)
注:图示例为升序扫描,降序扫描为先找到last page,再根据指针链找previous page
B-tree 区域扫描预读(readahead)
注:索引碎片会阻止预读.影响range scan 效率.
特殊类型B-tree扫描-(unordered range scan)
a.方式与堆扫描相同.
b.只有当读未提交隔离级别(read uncommitted)或table Lock时才会采用.
堆扫描(heap scan/table scan)
方式1
a.获取第一个IAM页
b.获取相应的extents
c.跟据IAM指针链获取下一个IAM页
d.重复b
方式2
a.获取第一个IAM页
b.根据IAM链表获取所有IAM页
c.获取所有的extents
索引碎片(Internal Fragmentation)
内部碎片:页中数据非连续存储.(数据行记录之间存在未使用空间)
造成原因:insert,update造成的页分裂.
Delete随机删除造成的未使用空间
来自混合区的初始分配页
大字节的数据行
外部碎片(External Fragmentation)
分为逻辑碎片(Logical Fragmentation),区碎片(Extent Fragmentation)
数据页/区逻辑上排序,但与在数据文件中(磁盘中)物理上的顺序非匹配.
逻辑碎片造成原因:insert,update造成的页分裂
大量删除造成的页从页链中被删除,造成页链不连续.
区碎片造成原因:随机删除造成的区内的某些页不再使用,但table中已经分配
范围删除造成整个区被回收造成区之间的缝隙.
不同的表/索引数据在区之间交错.
SQL Server 索引知识-结构,实现的更多相关文章
- SQL Server 索引知识-概念
概念篇 索引概念(index concept) 一种表或视图中相关的B-tree的数据结构.索引键列由一列或多列组成.可拥有包含性列(sql2005).用于提升Sql Server 查找相关数据行效率 ...
- SQL Server 索引知识-应用,维护
创建聚集索引 a索引键最好唯一(如果不唯一会隐形建立uniquier列(4字节)确保唯一,也就是这列都会复制到所有非聚集索引中) b聚集索引列所占空间应尽量小(否则也会使非聚集索引的空间变大) c聚集 ...
- SQL Server 索引结构及其使用(一)
转载:SQL Server 索引结构及其使用(一) 作者:freedk 一.深入浅出理解索引结构 实际上,您可以把索引理解为一种特殊的目录.微软的SQL SERVER提供了两种索引:聚集索引(clus ...
- SQL SERVER大话存储结构(4)_复合索引与包含索引
索引这块从存储结构来分,有2大类,聚集索引和非聚集索引,而非聚集索引在堆表或者在聚集索引表都会对其 键值有所影响,这块可以详细查看本系列第二篇文章:SQL SERVER大话存储结构 ...
- SQL Server 索引结构及其使用(一)[转]
SQL Server 索引结构及其使用(一) 作者:freedk 一.深入浅出理解索引结构 实际上,您可以把索引理解为一种特殊的目录.微软的SQL SERVER提供了两种索引:聚集索引(cluster ...
- 关于SQL Server索引密度的知识
文章主要描述的是SQL Server索引密度(Index Densities),当一个查询的SARG 的值直到查询运行时才得以知晓,或是SARG是一个关于索引的多列时,SQL Server才使用为索引 ...
- SQL server基础知识(表操作、数据约束、多表链接查询)
SQL server基础知识 一.基础知识 (1).存储结构:数据库->表->数据 (2).管理数据库 增加:create database 数据库名称 删除:drop database ...
- SQL Server索引进阶:第十级,索引内部结构
原文地址: Stairway to SQL Server Indexes: Level 10,Index Internal Structure 本文是SQL Server索引进阶系列(Stairway ...
- 【译】索引进阶(一):SQL SERVER索引介绍
[译注:此文为翻译,由于本人水平所限,疏漏在所难免,欢迎探讨指正] 原文链接:http://www.sqlservercentral.com/articles/Stairway+Series/7 ...
随机推荐
- php如何使用rabbitmq实现发布消息和消费消息(tp框架)(第一篇)
1,默认已经安装好了rabbitmq: 参考 http://www.cnblogs.com/spicy/p/7017603.html 2,安装rabbitmq客户端: 方法1: pecl 扩展安装 ...
- 按照Right-BICEP要求对实验二进行测试
我的代码实现的功能很简单,在最基本的功能上,包括有无括号(0/1),有无负数(0/1),有无乘除法(0/1)验证程序的正确性,测试用例为8个,2^3个,也就覆盖了所有的代码路径. 测试计划: 基本功能 ...
- js便签笔记(2)——DOM元素的特性(Attribute)和属性(Property)
1.介绍: 上篇js便签笔记http://www.cnblogs.com/wangfupeng1988/p/3626300.html最后提到了dom元素的Attribute和Property,本文简单 ...
- 词性标注 HMM
1.给定语料,统计语料中的词性为N,词组为M. 2.HMM关注3个参数 a.初始化概率 b.状态转移矩阵 N*N c.观测状态概率矩阵 N*M 3.状态转移矩阵:词A的词性为词性a,词B的词性为词性b ...
- freepbx13通话无声音通话自动挂断
在阿里云上用脚本一键搭建好了freepbx13,但是在创建好sip分机之后,打电话没有声音,双方都听不到对方的声音.这个是nat问题. 这里有个坑我提醒下大家,就是我们最好不要用台式电脑进行测试通话. ...
- MySQL中date类型的空值0000-00-00和00:00:00
1.如果mysql中使用了date类型,并且默认值为'0000-00-00', 那么数据库中的'0000-00-00 00:00:00', '0000-00-00', '00:00:00'这三个值是相 ...
- Oracle数据库 中的基础的一些语法结构
方括号里的内容为可选项 大括号是必填 1PL/SQL结构块 DECLARE /* * 声明部分——定义常量.变量.复杂数据类型.游标.用户自定义异常 */ BEGIN /* * 执行部分——PL/SQ ...
- Angular中的$q的形象解释及深入用法
作者:寸志链接:https://zhuanlan.zhihu.com/p/19622332来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 早上,老爸说:“儿子,天气如何 ...
- spark集群搭建(java)未完待续
环境 操作系统:windows10 虚拟机工具:VMware14.1 NUX版本:Centos7.2(64) JDK:1.8(64) 一.安装linux,master(桥接模式上网),slave(na ...
- Angular待办事项应用3
隔离业务逻辑 接着上一节,业务逻辑应该复古牛仔单独的service中,我们在todo文件夹中建立TodoService ng g s todo/todo 引入UUID包 todo中id要唯一,一个是采 ...