none
页面分割的问题 RRS feed

  • 问题

  • CREATE TABLE t1(c1 INT,c2 CHAR(999),c3 VARCHAR(10))
    INSERT INTO t1(c1,c2,c3)
    SELECT 100,'c2',''
    UNION ALL
    SELECT 200,'c2',''
    UNION ALL
    SELECT 300,'c2',''
    UNION ALL
    SELECT 400,'c2',''
    UNION ALL
    SELECT 500,'c2',''
    UNION ALL
    SELECT 600,'c2',''
    UNION ALL
    SELECT 700,'c2',''
    UNION ALL
    SELECT 800,'c2',''
    CREATE CLUSTERED INDEX t1_i1 ON dbo.t1(c1)
    这样  这8条记录在一行里,
    假如执行update t1 set c3='Add data' where c1=200,这样就会有页分裂。
    但是为什么第一页中就只剩下4行,然后第二列中也有4行。
    这是SQLServer默认的么?
    也就是说原始叶子页面中的半数行被移动到新的页面
    • 已编辑 Wison-Ho 2012年2月6日 3:52
    2012年2月6日 3:51

答案

  • 你好 Wison-Ho,

    我们可以通过 DBCC PAGE 命令去查看某个数据库中,某个数据文件上某一个页面存放的数据。根据你的描述,要查询分页后,每个叶子节点存放数据的情况,需要知道哪些数据页是这个聚集索引的叶子节点,然后在通过DBCC PAGE查看数据页数据。

    下面的语句是用查询tempdb中,表t1的聚集索引结构,包含每个层次中每一个数据页。其中,PagePID表示数据页码,PageFID表示该数据页在所在数据库的数据文件代号,IndexLevel表示这个页面位于第几层节点(0表示叶子节点,逐次向上递增),NextPagePID和PrevPagePID表示这个数据页在其所在的层前后相邻的数据页。

    EXEC ('DBCC IND (tempdb, t1, 1)'); go

    通过上面得到的结果,你可以知道2个叶子节点的文件页码和数据页码,如第一个文件的第198页和201页。那么我们可以可以通过下面的语句查看每个页面存放的数据:

    --开启跟踪,用于显示DBCC PAGE 的结果

    DBCC TRACEON (3604) GO

    --获取页码数据

    DBCC PAGE (tempdb, 1, 198, 3)

    DBCC PAGE (tempdb, 1, 201, 3)



    Stephanie Lv

    TechNet Community Support



    2012年2月7日 7:13

全部回复

  • Yes, sql moves half of data to new page during page split.
    2012年2月6日 14:41
  • Yes, sql moves half of data to new page during page split.
    是否有什么命令 看有几行在第一页 几行在第二页呢?

    If you haven't all the things you want,be grateful for the things you don't have that you didn't want.

    2012年2月7日 1:17
  • Can try 'dbcc page'.
    2012年2月7日 3:53
  • 你好 Wison-Ho,

    我们可以通过 DBCC PAGE 命令去查看某个数据库中,某个数据文件上某一个页面存放的数据。根据你的描述,要查询分页后,每个叶子节点存放数据的情况,需要知道哪些数据页是这个聚集索引的叶子节点,然后在通过DBCC PAGE查看数据页数据。

    下面的语句是用查询tempdb中,表t1的聚集索引结构,包含每个层次中每一个数据页。其中,PagePID表示数据页码,PageFID表示该数据页在所在数据库的数据文件代号,IndexLevel表示这个页面位于第几层节点(0表示叶子节点,逐次向上递增),NextPagePID和PrevPagePID表示这个数据页在其所在的层前后相邻的数据页。

    EXEC ('DBCC IND (tempdb, t1, 1)'); go

    通过上面得到的结果,你可以知道2个叶子节点的文件页码和数据页码,如第一个文件的第198页和201页。那么我们可以可以通过下面的语句查看每个页面存放的数据:

    --开启跟踪,用于显示DBCC PAGE 的结果

    DBCC TRACEON (3604) GO

    --获取页码数据

    DBCC PAGE (tempdb, 1, 198, 3)

    DBCC PAGE (tempdb, 1, 201, 3)



    Stephanie Lv

    TechNet Community Support



    2012年2月7日 7:13