位置: 编程技术 - 正文

SQL Server Page结构深入分析(page_sql)

编辑:rootadmin

推荐整理分享SQL Server Page结构深入分析(page_sql),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:sql的结构,sqlserver结果栏,pagehelper sqlserver分页,sqlserver数据库结构,sql server 数据结构,page_sql,sqlserver底层数据结构,sqlserver底层数据结构,内容如对您有帮助,希望把文章链接给更多的朋友!

SQL Server存储数据的基本单元是Page,每一个Page的大小是8KB,数据文件是由Page构成的。在同一个数据库上,每一个Page都有一个唯一的资源标识,标识符由三部分组成:db_id,file_id,page_id,例如,:1:,是数据库的ID,1是数据文件的ID,是Page的编号,Page的编号从0依次递增。8个连续的Page组成一个区(Extent),数据文件中已分配(Allocated)的空间被分割成区的整数倍。一次磁盘IO操作作用于Page级别,而空间分配的最小单元是区。

Page是用于存储数据的,不同类型的Page存储的数据是不同的,Page的结构也是不同的。有些Page是用于存储数据的,叫做Data Page,有些Page是用于存储索引结构中的中间节点的,叫做Index Page,有些Page是SQL Server存储引擎使用的,用于管理Page的,叫做系统页。本文关注的是Data Page和Index Page,跟数据表有关。

日志文件没有Page结构,它是由一系列的日志记录构成的。

一,Page的结构

每一个Page都由 头部(Header),内容(Content)和行偏移量(Offset)组成,头部是在Page的开始处,占用Bytes,用于存储Page的编号,Page的类型,分配单元(Allocation Unit)等系统信息。注:在单个Page中最多存储Bytes的数据。

The maximum amount of data and overhead that is contained in a single row on a page is 8, bytes (8 KB).

数据行存储在Page Header之后,数据行在Page中的物理存储是无序的,行的逻辑顺序是由行偏移(Row Offset)确定的,行偏移存储在Page的末尾,每一个行偏移是一个Slot,占用2B。行偏移连续排列在Page的末尾,称作槽数组(Slot Array)。行偏移以倒序方式存储行的偏移量,这意味着,从Page末尾向Page 开头计数,第一行的偏移量存储在Page的末尾Slot中,第二行的偏移量存储在Page末尾的第二个Slot中。

二,查看Page头部信息

Page头部信息存储的是Page的系统信息,可以使用非正式的命令来查看:

参数:file_id是数据库文件的ID;page_number是Page在当前文件中的编号;print_option是指打印信息的详细程度,默认值是0,只打印Page Header。

例如,查看资源标识符::1: Page的头部信息:

在我的数据库中,该Page的头部信息(移除Buffer的数据)如下所示,

Page 头部中各个字段的含义:

1,Page的编号

m_pageId = (1:),该Page所在的File ID 和Page ID

SQL Server Page结构深入分析(page_sql)

2,Page的类型

m_type = 1,Page的类型,常见的类型是数据页和索引页:

1 ? data page,用于表示:堆表或聚集索引的叶子节点2 ? index page,用于表示:聚集索引的中间节点或者非聚集索引中所有级别的节点其他Page类型(系统页是管理Page的Page,例如,GAM,IAM等)如下:

3 ? text mix page,4 ? text tree page,用于存储类型为文本的大对象数据7 ? sort page,用于存储排序操作的中间数据结果8 ? GAM page,用于存储全局分配映射数据GAM(Global Allocation Map),每一个数据文件被分割成4GB的空间块(Chunk),每一个Chunk都对应一个GAM数据页,GAM数据页出现在数据文件特定的位置处,一个bit映射当前Chunk中的一个区。9 ? SGAM page,用于存储SGAM页(Shared GAM) ? IAM page,用于存储IAM页(Index Allocation Map) ? PFS page,用于存储PFS页(Page Free Space) ? boot page,用于存储数据库的信息,只有一个Page,Page的标识符是:db_id:1:9, ? file header page,存储数据文件的数据,数据库的每一个文件都有一个,Page的编号是0。 ? diff map page,存储差异备份的映射,表示从上一次完整备份之后,该区的数据是否修改过。 ? ML map page,表示从上一次备份之后,在大容量日志(bulk-Logged)操作期间,该区的数据是否被修改过,This is what allows you to switch to bulk-logged mode for bulk-loads and index rebuilds without worrying about breaking a backup chain. ? a page that's be deallocated by DBCC CHECKDB during a repair operation. ? the temporary page that ALTER INDEX … REORGANIZE (or DBCC INDEXDEFRAG) uses when working on an index. ? a page pre-allocated as part of a bulk load operation, which will eventually be formatted as a ‘real' page.

3,Page在索引中的级数

数据页在索引中的索引级数,m_level=0,表示处于Leaf Level。

对于堆表(Heap),m_level=0表示的是Data Page;对于聚集索引,m_level=0表示的是Data Page;对于非聚集索引,m_level=0表示的是叶子节点

4, Page的元数据

Page的元数据十分重要,不仅能够查看处Page所在的Object,甚至能够查看该Page所在的分配单元和分区ID,在死锁进行故障排除时十分有用

Metadata: AllocUnitId =,该Page所在的分配单元ID(allocation_unit_id)Metadata: PartitionId =,该Page所在的分区的分区ID(partition_id)Metadata: IndexId = 1,该Page所在的索引IDMetadata: ObjectId = ,用于表示Page所属对象的object_id5,page的链指针

由于数据表的Page并不是单独存在的,而是通过双向链式结构连接在一起的,

m_prevPage = (1:) :用于表示前一个page (FileID : PageID) m_nextPage = (1:)  :用于表示下一个page (FileID:PageID)

6, 其他头部字段

m_slotCnt = 2 :页面中Slot的数量,用于Page中存储的数据行数m_freeCnt =   :页面中剩余的空间,单位是字节,还剩字节的空间  m_reservedCnt = 0 :为活动事务保留的存储空间,单位是字节m_ghostRecCnt = 0 :页面中存在的幽灵记录的总数(ghost record count) 关于Page头部的信息,可以阅读《Inside the Storage Engine: Anatomy of a page》;

三,利用Page的元数据排除死锁

Page的元数据包含分区ID,索引ID和对象ID,用户可以使用这些元数据,分析死锁产生的原因。系统追踪到产生死锁的资源,可能是一个Page的资源标识符,如果能够确认发生死锁是由于数据表或索引的分区不合理导致的,那么可以重新设置分区列,或者设置分区边界值,把单个分区拆分成多个分区,这样就能把竞争的临界资源分配到不同的分区中,避免查询请求对资源的竞争,进而减少死锁的发生。

Metadata: PartitionId ,该Page所在的分区的分区ID(partition_id);Metadata: IndexId ,该Page所在索引ID;Metadata: ObjectId,用于表示对象的object_id;

有关数据库SQL递归查询在不同数据库中的实现方法 本文给大家介绍有关数据库SQL递归查询在不同数据库中的实现方法,具体内容请看下文。比如表结构数据如下:Table:TreeIDNameParentId1一级二级三级四

ASP和SQL Server如何构建网页防火墙 ASP是Web上的客户机/服务器结构的中间层,虽然它使用脚本语言(JavaScript,VBScript等)编写,程序代码在服务器上运行,在客户端仅可看到由ASP输出的动态HTML

SQL Server查询前N条记录的常用方法小结 本文实例讲述了SQLServer查询前N条记录的常用方法。分享给大家供大家参考。具体如下:SQLServer查询前N条记录是我们经常要用到的操作,下面对SQLServer查

标签: page_sql

本文链接地址:https://www.jiuchutong.com/biancheng/312124.html 转载请保留说明!

上一篇:详解SQL Server表和索引存储结构(sqlserver数据表在哪里)

下一篇:有关数据库SQL递归查询在不同数据库中的实现方法(sql server递归查询)

  • 小型微利企业所得税减免政策
  • 销售返利可以计入销售费用吗
  • 价内税有哪些税种
  • 外出经营涉税事项报告
  • 房地产开发企业预缴增值税
  • 房地产企业利息资本化条件有哪些
  • 个税专项扣除做什么用
  • 固定资产折旧年限的最新规定2022
  • 房地产公司扣减土地出让金怎么入账?
  • 房地产契税新政策2021退税
  • 原材料保险公司赔偿会计分录怎么写
  • 供热企业采暖费收入免征增值税政策解读
  • 股权交易要不要缴纳印花税?
  • 农村合作社开的鸡蛋免税票可以抵进项税吗?
  • 当期应税销售收入是含税还是不含税
  • 普票和专票的税率分别是多少
  • 离婚房屋权属变动怎么办
  • 虚假会计凭证有哪些识别方法
  • 对公账户收到个人汇款 退还
  • 应收账款收款后怎么做账
  • 因税负低补缴上年度增值税分录怎么写?
  • 增值税有留底怎么申请退税
  • 金蝶固定资产减少怎么做
  • 增值税报表上期留底税额填不上
  • PHP:mb_ereg_replace_callback()的用法_mbstring函数
  • pddocument.load
  • 如何利用http协议发布博客园博文评论
  • php抓取
  • 转让旧固定资产怎么做账
  • 招聘退休人员北京宿管
  • 构造二叉排序树代码
  • 损益类科目借贷方向是什么
  • 在暴风雪中求生
  • 基于核心素养下的大单元教学设计
  • 开发成本怎么做分录
  • vue setstate
  • 如何使用应用程序
  • python制作chm
  • php注释有几种?如何表示?
  • 完美破费是什么意思
  • 天猫一般纳税人如何纳税
  • 企业所得税季报资产总额怎么填
  • 汇兑损益是资产类科目
  • 网上申报完还需要去税务局吗
  • 发票上的金额是含税还是不含税
  • 外贸出口备案需准备什么资料
  • 水利建设基金现在入费用还是入应交税费了
  • 安装购买的材料怎么做账
  • 行政单位怎样核销坏账
  • 新企业购买税控盘,没收入,怎么抵扣
  • 会计中劳保用品是什么
  • 公司向个人借款怎么做账
  • 净资产少于1元
  • 餐饮业固定资产怎么摊销
  • 差旅费出差补助标准
  • 固定资产折旧成本票据类型
  • 香港发票在内地认可吗
  • 代理返利
  • 怎么把u盘两个盘合并到一起
  • 并发控制三个问题
  • Red Hat Enterprise Linux 4+Nginx 0.7.47+PHP5.2+MYSQL5.0+Memcache+eAccelerator收
  • windowsxp服务在哪里
  • 重装系统后没声音怎么解决win7
  • ubuntu 配置
  • centos重启动停在4m
  • windows 7安装步骤
  • cocos2dx入门
  • 批处理命令修改ip
  • node.js创建服务
  • linux归档文件什么意思
  • json初学
  • js判断数据是否存在
  • 工资6200要交多少个人所得税
  • 安阳市灵活就业人员社保补贴
  • 贵州税务机关
  • 开采砂石
  • 如何理解财税一体化
  • 个人所得税全员申报什么时候开始的
  • 3%增值税专用发票成本多少钱
  • 查询产品真伪怎么查询app
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设