SQL Server 基础存储结构 B-tree和Heap特性

聚集索引架构 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 但,查询谓词中有聚集索引时,应显示添加聚集索引未非聚集包含性列

f 包含性列(include columns)

包含性列(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中已经分配

              范围删除造成整个区被回收造成区之间的缝隙.

              不同的表/索引数据在区之间交错.

时间: 2024-08-29 08:26:52

SQL Server 基础存储结构 B-tree和Heap特性的相关文章

人人都是 DBA(VIII)SQL Server 页存储结构

原文:人人都是 DBA(VIII)SQL Server 页存储结构 当在 SQL Server 数据库中创建一张表时,会在多张系统基础表中插入所创建表的信息,用于管理该表.通过目录视图 sys.tables, sys.columns, sys.indexes 可以查看新建的表的元数据信息. 下面使用创建 Customer 表的过程作为示例. USE [TEST] GO DROP TABLE [dbo].[Customer] GO CREATE TABLE [dbo].[Customer]( [I

SQL Server 2008存储结构之非聚集索引

非聚集索引与聚集索引具有相同的 B 树结构,它们之间的显著差别在于以下两点: 基础表的数据行不按非聚集键的顺序排序和存储. 非聚集索引的叶层是由索引页而不是由数据页组成. 非聚集索引既可以建在堆表结构上也可以建在聚集索引表上:非聚集索引中的每个索引行都包含非聚集键值和行定位符.此定位符指向聚集索引或堆中包含该键值的数据行. 如果表是堆则行定位器是指向行的指针.该指针由文件标识符 (ID).页码和页上的行数生成.整个指针称为行 ID (RID). 如果表包含有聚集索引,则行定位器是行的聚集索引键.

SQL Server 2008存储结构之GAM、SGAM介绍_mssql2008

当我们创建一个数据库的时候,例如以缺省的方式CREATE DATABASE TESTDB,SQLServer自动帮我们创建好如下两个数据库文件. 这两个数据文件是实实在在的操作系统文件,其中一个是叫行数据文件,用来存储数据库的各种对象,另外一个是日志文件,从来记录数据变化的过程. 从逻辑角度而言,数据库的最小存储单位为页即8kb. 数据库被分成若干逻辑页面(每个页面8KB),并且在每个文件中,所有页面都被连续地从0到x编号,其中x是由文件的大小决定的.我们可以通过指定一个数据库ID.一个文件ID

SQL Server 2008存储结构之IAM结构

索引分配映射(Index Allocation Map,IAM)页面在4  GB的区间中跟踪被一个分配单元所使用的区.一个分配单元就是一组页面,这些页面属于一个数据表或索引的单个分区.它由下面三种类型页面中的一种组成:含 有常规的行内数据的页面.含有大型对象(Large Object,LOB)数据的页面和含有行溢出数据的页面. 其实SQL  Server的数据页面类型与Oracle的段的概念有些类似,一个对象包含若干段,而一个段只能属于一个对象. 假如一张在四个分区上 的含有所有三种类型的数据(

SQL Server基础之<索引>

原文:SQL Server基础之<索引>  索引用于快速找出在某个列中有某一特定值的行,不使用索引,数据库必须从第一条记录开始读完整个表,直到找出相关的行.表越大,查询数据所花费的时间越多,如果表中查询的列有一个索引,数据库能快速到达一个位置去搜索数据,本篇主要介绍与索引相关的内容,包括索引的含义和特点,索引的分类,索引的设计原则以及如何创建和删除索引. 一:索引的含义和特点  索引是一个单独的,存储在磁盘上的数据结构,它们包含则对数据表里所有记录的引用指针,使用索引用于快速找出在某个或多个列

SQL Server基础之&lt;存储过程&gt;

原文:SQL Server基础之<存储过程>   简单来说,存储过程就是一条或者多条sql语句的集合,可视为批处理文件,但是其作用不仅限于批处理.本篇主要介绍变量的使用,存储过程和存储函数的创建,调用,查看,修改以及删除操作. 一:存储过程概述  SQL Server中的存储过程是使用T_SQL编写的代码段.它的目的在于能够方便的从系统表中查询信息,或者完成与更新数据库表相关的管理任务和其他的系统管理任务.T_SQL语句是SQL Server数据库与应用程序之间的编程接口.在很多情况下,一些代

SQL Server基础之&lt;游标&gt;

原文:SQL Server基础之<游标> 查询语句可能返回多条记录,如果数据量非常大,需要使用游标来逐条读取查询结果集中的记录.应用程序可以根据需要滚动或浏览其中的数据.本篇介绍游标的概念.分类.以及基本操作等内容. 一:认识游标   游标是SQL Server的一种数据访问机制,它允许用户访问单独的数据行.用户可以对每一行进行单独的处理,从而降低系统开销和潜在的阻隔情况,用户也可以使用这些数据生成的SQL代码并立即执行或输出. 1.游标的概念  游标是一种处理数据的方法,主要用于存储过程,触

SQL Server基础

server  1.1.        SQL Server的发展历程SQL Server是Microsoft公司的一个关系数据库管理系统,但说起它的历史,却得从Sybase开始的.SQL Server从20 世纪80年代后期开始开发,最早起源于1987年的Sybase SQL Server.SQL Server最初是由Microsoft.Sybase 和Ashton-Tate三家公司共同开发的,1988年,Microsoft公司.Sybase公司和Aston-Tate公司把该产品移植到OS/2

各种类型文件在SQL Server中存储的解决方案

server|解决 数据的持久化是开发的基础性工作,我们不可避免要将各种的类型文件持久化,关于文件(或是大对象)的存储,我在我的blog http://www.cnblogs.com/supercode/articles/156744.html谈过今天我们从设计的角度来实现这功能,从本文中您将了解道以下内容l         SQL Server中的数据类型l         数据表,存储过程的设计l         逻辑层实现各种类型文件的自动转化l         DataGrid中的自定义