SQL Server中表的行大小的差异

时间:2018-02-28 16:14:07

标签: sql sql-server

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字节的值?

谢谢, 帕

1 个答案:

答案 0 :(得分: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个字节);