具有 4,000,000 行的 SQL Server 表为 40GB

Hoo*_*ody 4 performance sql-server database-size

我一直试图弄清楚为什么我们的生产数据库最近增长如此之快,并发现原因是审计表。我们将存档表以解决问题,但我只是想检查表的大小对于像这样的大型 SQL 服务器表是否正常。它有 4,000,000 行,结构如下...

Name                    Type        Nullable
AuditLogId              bigint      no
UserName                nvarchar    no
TimeOfChange            datetime    no
ObjectName              nvarchar    no
ChangeName              nvarchar    no
RecordId                int         yes
OriginalValues          nvarchar    yes
ResultingValues         nvarchar    no
Run Code Online (Sandbox Code Playgroud)

使用 AuditLogId 上的主键

ALTER TABLE [dbo].[AuditLog] ADD  CONSTRAINT [PK_AuditLog] PRIMARY KEY CLUSTERED 
(
    [AuditLogId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)

在 RecordId 上更新的记录还有一个外键。nvarchar 字段似乎有多达 12,000 个字符,平均大约 8000 个字符。该表目前的大小为 40GB,这看起来对吗?如果我上面发布的内容无法回答该问题,我可以在表格上提供更多信息。

谢谢

Aar*_*and 17

您有 4,000,000 行,其中一列平均有 8,000 个字符(我假设为 16,000 字节)。

SELECT CONVERT(bigint,4000000) * /* b */ 16000 / /*kb*/ 1024 / /*mb*/ 1024;
------
61,035
Run Code Online (Sandbox Code Playgroud)

如果您的统计数据准确,我希望该表为 61 GB。(我想知道您的意思是 8,000 个字节,而不是 8,000 个字符,在这种情况下,我希望大于 30 GB。)

其他因素包括:

  • 我在上面的计算中没有考虑到其他列中的数据
  • 附加索引
  • 填充因子 > 0 和 < 100
  • 碎片和空间仍然被删除的行或页面拆分占用