【问题标题】:DBCC PAGE output analysisDBCC PAGE 输出分析
【发布时间】:2018-03-10 15:53:33
【问题描述】:

我创建了下表

USE [Test]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Table_3]
(
    [id] [int] NOT NULL,
    [itemcode] [int] NOT NULL,
    [value] [decimal](18, 5) NOT NULL,
    [date] [date] NOT NULL,
    [gain] [decimal](18, 5) NULL,
    [loss] [decimal](18, 5) NULL
) ON [PRIMARY]
GO

insert into dbo.table_3 
values (1,1,1000.0,'28-Feb-2018',null,null)


DBCC IND ('Test','Table_3',-1)
GO

上面 DBCC IND 命令的输出给出了两行

PageFID PagePID IAMFID  IAMPID  ObjectID    IndexID PartitionNumber PartitionID iam_chain_type  PageType    IndexLevel  NextPageFID NextPagePID PrevPageFID PrevPagePID
1   297 NULL    NULL    581577110   0   1   72057594040877056   In-row data 10  NULL    0   0   0   0
1   296 1   297 581577110   0   1   72057594040877056   In-row data 1   0   0   0   0   0

然后我使用上面的输出来获取页面详细信息

DBCC TRACEON (3604)
DBCC PAGE ('Test',1,297,1)
GO

同样的输出是

页面:(1:297) 缓冲: BUF @0x04797150 bpage = 0x07D74000 bhash = 0x00000000
bpageno = (1:297) bdbid = 9 breferences = 0 bcputicks = 0 bsampleCount = 0 bUse1 = 26039
bstat = 0x10b 博客 = 0x15adb21c bnext = 0x00000000
页眉: 页面@0x07D74000 m_pageId = (1:297) m_headerVersion = 1
m_type = 10 m_typeFlagBits = 0x0 m_level = 0
m_flagBits = 0x0 m_objId (AllocUnitId.idObj) = 125 m_indexId (AllocUnitId.idInd) = 256 元数据:AllocUnitId = 72057594046119936
元数据:PartitionId = 72057594040877056
元数据:IndexId = 0 元数据:ObjectId = 581577110 m_prevPage = (0:0) m_nextPage = (0:0) pminlen = 90
m_slotCnt = 2 m_freeCnt = 6 m_freeData = 8182
m_reservedCnt = 0 m_lsn = (48:296:16) m_xactReserved = 0 m_xdesId = (0:0) m_ghostRecCnt = 0 m_tornBits = 0 DB Frag ID = 1

分配状态

GAM (1:2) = 已分配 SGAM (1:3) = 已分配
PFS (1:1) = 0x70 IAM_PG MIXED_EXT ALLOCATED 0_PCT_FULL
DIFF (1:6) = 更改 ML (1:7) = NOT MIN_LOGGED

数据: 插槽 0,偏移量 0x60,长度 94,DumpStyle BYTE 记录类型 = PRIMARY_RECORD 记录属性 =
记录大小 = 94 内存转储@0x0D52C060 00000000: 00005e00 00000000 00000000 00000000 00000000 ..^........ 00000014:00000000 00000000 00000000 00000000 00000000 .................... 00000028:00000000 01002801 00000100 00000000 00000000 ......(...... 0000003C: 00000000 00000000 00000000 00000000 00000000 ..................... 00000050: 00000000 00000000 00000000 0000 ....................

插槽 1,偏移量 0xbe,长度 7992,DumpStyle BYTE

记录类型 = PRIMARY_RECORD 记录属性 =
记录大小 = 7992

内存转储@0x0D52C0BE

如果表格中只有一行,它怎么会有两个插槽(插槽 0 和插槽 1,我没有粘贴插槽 1 的文本,因为它很大)?因为它是一个有 5 个固定数据类型列的表,所以我期望的大小是 2*4 (int)+ 1*3(date) +3*9 (decimal (18,5)) = 38 bytes 但记录大小提到94,我是不是看错了?

跟进问题

根据 Dan 的评论,我更改了页面 id,这次选择了 296。

这是 DBCC PAGE ('Test',1,296,1) 的输出

插槽 0,偏移量 0x60,长度 45,DumpStyle BYTE

记录类型 = PRIMARY_RECORD 记录属性 = NULL_BITMAP
记录大小 = 45

内存转储@0x0CC1C060

00000000: 10002a00 01000000 01000000 0100e1f5 05000000 ..*.............áõ.... 00000014: 00f03d0b 00000100 01000000 1c000000 60a29f07 .ð=................`¢。 00000028: d8660600 30
Øf..0

不应该是 38 岁(根据我上面解释的理解)而不是 45 岁?

【问题讨论】:

  • 您需要指定 296(DBCC_IND 第二行的 PagePID)而不是 297(IAM 页面)。

标签: sql-server


【解决方案1】:

记录头(4字节长)

-2 bytes of record metadata 
-2 bytes pointer to null bitmap

固定长度数据(38字节长)

-8 bytes per int
-3 bytes per date
-27 bytes per decimal

空位图(3 字节长)

-2 bytes for count of columns in the record
-1 byte to store one bit per column in the record

总和是 45 个字节

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 2020-01-24
    • 2023-03-23
    • 2011-08-05
    相关资源
    最近更新 更多