【发布时间】: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