• [20140722] forwarded和forwarding记录


    背景:

    今天被人文集forwarded和forwarding记录的事情。

    简单介绍:

    当堆表跟新某一个列的时候发现,不够放了,那么就在那行记录上标记forwarding,并把数据放到另外一个page,行被标记上forwarded。

    有《深入解析 sql server 2008》 可以看 p272,里面稍微有点提及

    关于page的资料:

         可以查看 http://www.sqlskills.com/blogs/paul/inside-the-storage-engine-anatomy-of-a-record/

    DROP TABLE bigrows;
    GO
    CREATE TABLE bigrows
    ( a int IDENTITY PRIMARY KEY,
    b varchar(1600),
    c varchar(1600));
    GO
    INSERT INTO bigrows
    VALUES (REPLICATE('a', 1600), '');
    INSERT INTO bigrows
    VALUES (REPLICATE('b', 1600), '');
    INSERT INTO bigrows
    VALUES (REPLICATE('c', 1600), '');
    INSERT INTO bigrows
    VALUES (REPLICATE('d', 1600), '');
    INSERT INTO bigrows
    VALUES (REPLICATE('e', 1600), '');
    GO
    UPDATE bigrows
    SET c = REPLICATE('x', 1600)
    WHERE a = 3;
    GO
    
    DBCC IND(tst,bigrows,1)

    之后 dbcc page 就会看到a=3这一行被forward了。

    返回:04e42100 00010001 00

    0x04表示forwarded记录,e4210000 表示forward的page(paul blog的说法和 《深入解析 sql server 2008》说法不一致,我认为paul blog内的说法更加靠谱),中间那个1 表示fileid,最后一个1表示slowid,根据paul blog的说法:

    http://www.sqlskills.com/blogs/paul/forwarding-and-forwarded-records-and-the-back-pointer-size/#comment-87661

    2-byte file ID, 4-byte page-in-file, 2-byte slot ID

    forwarding记录头(不包含可变数据)

    返回:32000800 05000000 03000003 00530693 0c9d8c

    普通记录(不包含可变数据)

    返回:30000800 06000000 03000002 00510654 06

    0x32其中可以通过发的paul的blog里面可以发现这个行是forwarded。之后的和普通的行格式是一样的,会发现多了1个可变列,并且存的是forwarding的page信息。

    最后一个可变字段数据:00 04e22100 00010002 00  。

  • 相关阅读:
    安装MySQLdb
    树莓派及其他硬件平台国内外Linux镜像站全汇总
    rpc使用举例
    SAE上安装第三方模块
    【Java】Map
    【Java】判断字符串是否含字母
    【Android Studio】提示代码忽略大小写
    【iOS】Xcode 离线文档
    【iOS】iOS main() 简介
    【eclipse】No enclosing instance of type A is accessible. Must qualify the allocation with an enclosing instance of type A
  • 原文地址:https://www.cnblogs.com/Amaranthus/p/3860939.html
Copyright © 2020-2023  润新知