none
关于页的一些疑问 RRS feed

  • 问题

  • SQLSERVER一页是8K,然后字节=8*1024=8192,然后微软文档说每页的页数据是8060字节,然后还有页头是96个字节,那么8060+96=8156,那么8192-8156=36个字节
    这剩余的36个字节是干什么的?
    2012年11月7日 7:55

答案

  • 首先微软的文档没有说每页的页数据是8060字节,而是说“The maximum amount of data and overhead that is contained in a single row on a page is 8,060 bytes (8 KB). ” ,相关的说明跟页面的结构图可以查看下面。

    msdn.microsoft.com/en-us/library/ms190969(v=sql.105).aspx

    如果你能了解行偏移表的作用,那你就自然能了解行偏移表是固定的还是不固定的。

    偏移表的作用是只指向页面中每行数据起始位置,每行占据偏移表的2个字节,假如行偏移表固定是36个字节的话,那么如果那个页面超过18行的话,怎么办?所以显然是不固定的。


    • 已编辑 Michael CS 2012年11月7日 8:36
    • 已标记为答案 Guanjm 2012年11月7日 9:21
    2012年11月7日 8:35

全部回复

  • 行偏移表

    想不想时已是想,不如不想都不想。

    2012年11月7日 8:19
    版主
  • 页尾的行指示器占2字节,其余的是保留的字节为以后扩展说保留的


    麻将

    2012年11月7日 8:21
  • 是不是行偏移表固定是36个字节还是不固定的?
    2012年11月7日 8:22
  • 首先微软的文档没有说每页的页数据是8060字节,而是说“The maximum amount of data and overhead that is contained in a single row on a page is 8,060 bytes (8 KB). ” ,相关的说明跟页面的结构图可以查看下面。

    msdn.microsoft.com/en-us/library/ms190969(v=sql.105).aspx

    如果你能了解行偏移表的作用,那你就自然能了解行偏移表是固定的还是不固定的。

    偏移表的作用是只指向页面中每行数据起始位置,每行占据偏移表的2个字节,假如行偏移表固定是36个字节的话,那么如果那个页面超过18行的话,怎么办?所以显然是不固定的。


    • 已编辑 Michael CS 2012年11月7日 8:36
    • 已标记为答案 Guanjm 2012年11月7日 9:21
    2012年11月7日 8:35
  • 那么如果正好页数据占用或超过了8096个字节,然后行数又超过了18行,那么行偏移量怎么存放超过的行数,是跟行溢出一样,可以部分存放在其他页?

    2012年11月7日 8:44
  • SQL SERVER会保证能放置的行数可以让偏移表都可以指向到,如果放不下了,那相应的行跟偏移表都会移到另外一页。等下我给你做个实验。


    All kinds of RDMS are similar,but the DBAs are different.



    2012年11月7日 9:23
  • use tempdb

    go

    create table t1(c1 char(8))
    insert into t1 values('A')
    GO 540

    c1 长度为8bytes,每行数据的overhead 为7 bytes (为什么为7?所有的列为固定长度,并且列数不超过8的行的overhead 都为7 bytes )

    这样每行数据的长度为15bytes , 所以理论上每页可以容纳 8096/15= 540 行

    然后我们执行

    DBCC TRACEON(3604)
    DBCC IND([tempdb], 't1', -1)
    DBCC TRACEOFF(3604)

    从执行结果可以看到 数据页为2页

    PageFID PagePID IAMFID IAMPID ObjectID 
    1 142 NULL NULL 407672500 
    1 146 1 142 407672500 
    1 200 1 142 407672500 

    再执行下面

    DBCC TRACEON(3604)
    DBCC PAGE([tempdb], 1, 146, 1)
    DBCC TRACEOFF(3604)

    结果中可以看到 m_slotCnt = 453 ,这说明只存放了  453 行

    再执行下面

    DBCC TRACEON(3604)
    DBCC PAGE([tempdb], 1, 200 , 1)
    DBCC TRACEOFF(3604)

    结果中可以看到 m_slotCnt = 87 

    正好满足453 +87 =540


    All kinds of RDMS are similar,but the DBAs are different.



    2012年11月7日 11:05