聊一聊 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 比较逻辑供进一步研究。
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com