聊一聊 SQLSERVER 的行不能跨页
发布网友
发布时间:2024-10-23 22:19
我来回答
共1个回答
热心网友
时间:2024-10-24 11:52
深入理解 SQLSERVER 行与数据页的关系
在 SQLSERVER 的数据存储中,每个数据页的大小为 8k,这页数据如何被组织利用,是理解 SQLSERVER 数据存储机制的关键。
一个数据页分为三个主要部分:元数据区、数据存储区、slot 槽位。元数据区标记数据页类型和统计信息,数据存储区存放表的每条记录及元数据,slot 槽位记录行记录在数据页上的偏移地址。
理解行的最大大小,SQLSERVER 可定义的最大行大小为 8060 byte,包括 7byte 的元数据大小,实际定义的大小为 8053byte。此大小位于数据存储区中,计算页面是否满或预留空间,结果为页面末位有 34byte 的保留大小。
验证推理,尝试定义一行 8054byte 的大小,发现行记录总大小超过系统,页面中确实有 34byte 的保留空间。通过观察数据页,发现行记录分配在 456 号数据页上,使用 DBCC PAGE 显示页面元数据占 96byte,m_freeCnt = 34 表示当前页面的剩余空间,与计算结果一致。
总结,数据页保留有 34byte 的空间,出于某些原因可能不再添加,可通过 WinDbg 观察源码逻辑,例如在 SECreateRowset() 方法中抛出 RaiseHoBtRowsizeError() 异常,常量 cmp 比较逻辑供进一步研究。