SQL Server中表的行大小的差异

问题描述 投票:0回答:1
CREATE TABLE [dbo].[Account]
(
     [AccountId] [int] IDENTITY(1,1) NOT NULL,
     [RowVersion] [timestamp] NOT NULL,
     [Deleted] [bit] NOT NULL CONSTRAINT [DF_Account_Deleted]  DEFAULT ((0)),
     [CurrentBalance] [decimal](19, 4) NOT NULL DEFAULT ((0)),
     [ExtrasCurrentBalance] [decimal](19, 4) NOT NULL DEFAULT ((0)),

     CONSTRAINT [PK_Account] 
         PRIMARY KEY CLUSTERED ([AccountId] ASC)
) ON [PRIMARY]

根据https://docs.microsoft.com/en-us/sql/relational-databases/databases/estimate-the-size-of-a-heap的逻辑

Row_Size = Fixed_Data_Size + Variable_Data_Size + Null_Bitmap + 4

所以我的行大小应该是

(6+8+1+9+8)+3+4 = 39

但是在执行此查询时

DBCC SHOWCONTIG ('dbo.Account') with tableresults

我认为MinimumRecordSizeMaximumRecordSize为52。

enter image description here

那我们怎么得到一个52字节的值?

谢谢,风

sql sql-server
1个回答
1
投票

我相信你的数据库中有行版本控制,然后才有意义。

您可以查看此查询:

SELECT name, is_read_committed_snapshot_on, snapshot_isolation_state
FROM sys.databases;

如果您正在使用的数据库中有任一标志,那么您将进行行版本控制,它本身会为您的行大小添加14个字节。

所以52分解如下:

  • 开销为7个字节(列数,内部标志,空位图,行大小等);
  • 行版本控制的14个字节;
  • 列的31个字节(int = 4个字节,时间戳= 8个字节,位=每位1位,四舍五入到整个字节,十进制(19)= 9个字节);
© www.soinside.com 2019 - 2024. All rights reserved.