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

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介: 本文介绍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 但,查询谓词中有聚集索引时,应显示添加聚集索引未非聚集包含性列

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中已经分配

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

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

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
8月前
|
存储 SQL Web App开发
SQL实践篇(一):使用WebSQL在H5中存储一个本地数据库
SQL实践篇(一):使用WebSQL在H5中存储一个本地数据库
170 2
|
8月前
|
SQL 存储 数据库
SQL实践篇(二):为什么微信用SQLite存储聊天记录
SQL实践篇(二):为什么微信用SQLite存储聊天记录
448 1
|
3月前
|
SQL 存储 数据库
SQL学习一:ACID四个特性,CURD基本操作,常用关键字,常用聚合函数,五个约束,综合题
这篇文章是关于SQL基础知识的全面介绍,包括ACID特性、CURD操作、常用关键字、聚合函数、约束以及索引的创建和使用,并通过综合题目来巩固学习。
71 1
|
6月前
|
SQL 关系型数据库 数据处理
SQL结构
【7月更文挑战第28天】SQL结构
33 4
|
5月前
|
SQL 安全 Java
访问者模式问题之在上面的 SQL 结构定义中, sealed 接口的作用如何理解
访问者模式问题之在上面的 SQL 结构定义中, sealed 接口的作用如何理解
|
6月前
|
存储 SQL 数据库
MySQL设计规约问题之为何推荐用DECIMAL代替FLOAT和DOUBLE来存储精确浮点数
MySQL设计规约问题之为何推荐用DECIMAL代替FLOAT和DOUBLE来存储精确浮点数
|
7月前
|
SQL 关系型数据库 MySQL
mysqldiff - Golang 针对 MySQL 数据库表结构的差异 SQL 工具
Golang 针对 MySQL 数据库表结构的差异 SQL 工具。https://github.com/camry/mysqldiff
102 7
|
8月前
|
SQL XML Java
MyBatis的强大特性--动态SQL
MyBatis的强大特性--动态SQL
96 2
|
7月前
|
SQL 存储 关系型数据库
PolarDB产品使用合集之有的sql里面有自定义存储函数 如果想走列存有什么优化建议吗
PolarDB是阿里云推出的一种云原生数据库服务,专为云设计,提供兼容MySQL、PostgreSQL的高性能、低成本、弹性可扩展的数据库解决方案,可以有效地管理和优化PolarDB实例,确保数据库服务的稳定、高效运行。以下是使用PolarDB产品的一些建议和最佳实践合集。
344 0
|
8月前
|
SQL 关系型数据库 MySQL
TiDB特有的SQL语法和特性
【2月更文挑战第28天】本章将深入探讨TiDB特有的SQL语法和特性,这些功能和优化是TiDB相较于传统关系型数据库所独有的。通过了解这些特性,读者将能更充分地利用TiDB的优势,优化数据库性能,提升业务处理效率。