索引的作用毋庸置疑,但他是如何组织,并实现提高语句访问效率的呢?本篇文章为大家做个详细的介绍.

聚集索引架构 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 索引知识-结构,实现的更多相关文章

  1. SQL Server 索引知识-概念

    概念篇 索引概念(index concept) 一种表或视图中相关的B-tree的数据结构.索引键列由一列或多列组成.可拥有包含性列(sql2005).用于提升Sql Server 查找相关数据行效率 ...

  2. SQL Server 索引知识-应用,维护

    创建聚集索引 a索引键最好唯一(如果不唯一会隐形建立uniquier列(4字节)确保唯一,也就是这列都会复制到所有非聚集索引中) b聚集索引列所占空间应尽量小(否则也会使非聚集索引的空间变大) c聚集 ...

  3. SQL Server 索引结构及其使用(一)

    转载:SQL Server 索引结构及其使用(一) 作者:freedk 一.深入浅出理解索引结构 实际上,您可以把索引理解为一种特殊的目录.微软的SQL SERVER提供了两种索引:聚集索引(clus ...

  4. SQL SERVER大话存储结构(4)_复合索引与包含索引

              索引这块从存储结构来分,有2大类,聚集索引和非聚集索引,而非聚集索引在堆表或者在聚集索引表都会对其 键值有所影响,这块可以详细查看本系列第二篇文章:SQL SERVER大话存储结构 ...

  5. SQL Server 索引结构及其使用(一)[转]

    SQL Server 索引结构及其使用(一) 作者:freedk 一.深入浅出理解索引结构 实际上,您可以把索引理解为一种特殊的目录.微软的SQL SERVER提供了两种索引:聚集索引(cluster ...

  6. 关于SQL Server索引密度的知识

    文章主要描述的是SQL Server索引密度(Index Densities),当一个查询的SARG 的值直到查询运行时才得以知晓,或是SARG是一个关于索引的多列时,SQL Server才使用为索引 ...

  7. SQL server基础知识(表操作、数据约束、多表链接查询)

    SQL server基础知识 一.基础知识 (1).存储结构:数据库->表->数据 (2).管理数据库 增加:create database 数据库名称 删除:drop database ...

  8. SQL Server索引进阶:第十级,索引内部结构

    原文地址: Stairway to SQL Server Indexes: Level 10,Index Internal Structure 本文是SQL Server索引进阶系列(Stairway ...

  9. 【译】索引进阶(一):SQL SERVER索引介绍

      [译注:此文为翻译,由于本人水平所限,疏漏在所难免,欢迎探讨指正]  原文链接:http://www.sqlservercentral.com/articles/Stairway+Series/7 ...

随机推荐

  1. [转]asp.net core中的View Component

    解读ASP.NET 5 & MVC6系列(14):View Component http://www.cnblogs.com/TomXu/p/4496486.html

  2. Android 开发工具类 15_ MyAsyncTask

    AsyncTask 对于生命周期较短且需要在UI上显示进度和结果的后台操作是很好的解决方案.然而,当 Activity 重新启动时,这种操作将不会持续进行,也就是说,AsyncTask 在设备的方向变 ...

  3. python笔记06-----常用模块(time,os,sys,random)

    模块 1. 模块的定义和导入 定义: 模块:用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能),本质就是.py结尾的python文件(文件名:test.py对应的模块名:test) ...

  4. for循环的3个参数

    1.最常用的方法是用来遍历集合 /** **第一个参数:表示循环的初始值,或初始条件,这里是i=0; **第二个参数:是循环的条件,这里是当i小于list的长度时; **第三个参数:每次循环要改变的操 ...

  5. redis集群与分片(2)-Redis Cluster集群的搭建与实践

    Redis Cluster集群 一.redis-cluster设计 Redis集群搭建的方式有多种,例如使用zookeeper等,但从redis 3.0之后版本支持redis-cluster集群,Re ...

  6. JavaScript 作用域(Scope)详解

    先对需要用到的名词解释一下,再通过例子深入理解 一.什么是作用域(Scope) [[scope]]:每个javascript函数都是一个对象,对象中有些属性我们可以访问,但有些不可以,这些属性仅供ja ...

  7. JDK动态代理[2]----JDK动态代理的底层实现之Proxy源码分析

    在上一篇里为大家简单介绍了什么是代理模式?为什么要使用代理模式?并用例子演示了一下静态代理和动态代理的实现,分析了静态代理和动态代理各自的优缺点.在这一篇中笔者打算深入源码为大家剖析JDK动态代理实现 ...

  8. C#比较两个字符串的相似度【转】

    原文地址:http://www.2cto.com/kf/201202/121170.html 我们在做数据系统的时候,经常会用到模糊搜索,但是,数据库提供的模糊搜索并不具备按照相关度进行排序的功能. ...

  9. 【转】Dubbo声明式缓存

    缓存的应用非常广泛,为了提高数据访问的速度.Dubbo也不例外,它提供了声明式缓存,以减少用户加缓存的工作量. 一.Dubbo中缓存策略 lru 基于最近最少使用原则删除多余缓存,保持最热的数据被缓存 ...

  10. python学习之老男孩python全栈第九期_数据库day001知识点总结 —— MySQL操作数据库以及数据表、基本数据类型、基本增删改查、外键定义以及创建

    一. 学习SQL语句规则以及外键 1. 操作文件夹 create database db2; 创建文件夹 create database db2 default charset utf8; 创建文件夹 ...