【问题标题】:Null bitmap is set when there is no null columns没有空列时设置空位图
【发布时间】:2017-12-27 04:32:08
【问题描述】:

我正在学习 PAGE 结构,目前我被困在 NULL 位图上。

create table dbo.ro
(
ID int not null,
Col1 varchar(8000) null,
Col2 varchar(8000) null
);
insert into dbo.ro(ID, Col1, Col2) values
(1,replicate('a',8000),replicate('b',8000));

所以目前没有 NULL 值,让我们看看 DBCC 信息:

DBCC IND(test, 'ro', 1);
DBCC PAGE('test',1, 408,3);

所以我对以下部分感兴趣 30000800 01000000 03005002

  • 30 - 比特A
  • 00 - 位B
  • 0800 - F数据长度
  • 01000000 - 固定数据 (ID = 1)
  • 0300 - 列数
  • 50 - 空位图

为什么是 50 而不是 00?记录中没有NULL值...

【问题讨论】:

  • 你解析错了。最后的字节是03 00 50 02。空位图是50,而不是05。底部三位是0。其他位应忽略。
  • 只有低三位是相关的。位图可以是F89820 或任何其他值,它的含义仍然相同。处理空位图的代码可能根本不负责将无关位清零。

标签: sql-server dbcc data-paging


【解决方案1】:

正确答案在评论中,我投了赞成票,但你还有一个问题,所以也许我应该解释一下这是什么意思。

低三位为0。其他位应忽略。

如果将 50 展开为二进制,则得到 01010000。 唯一感兴趣的位是底部三位,它们对应于不为空的 3、2、1 列。 其他位应该忽略表示服务器知道列数,它是 3,它只关心这个掩码中的 3 位。其他位没有设置,因为它们应该被忽略。它们只是包含一个垃圾。

【讨论】:

  • 这个“垃圾”逻辑是否记录在某处?
  • 我认为不,这很明显。除非您第一次使用数据页面 + 您的实例在使用前将数据文件清零,否则所有后续页面使用不会将其清零,您只需覆盖之前写入的内容。您可以向自己证明插入更多行并检查该行中的 nullbitmap:它可能不同,但底部 3 位始终为 0。或者我可以给你这个链接,搜索“crap-shoot”并阅读它:sqlskills.com/blogs/paul/misconceptions-around-null-bitmap-size
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-10
  • 1970-01-01
相关资源
最近更新 更多