添加新列后表大小不会改变

got*_*tqn 2 sql-server size alter-table sql-server-2014

我正在尝试检查添加具有默认值的新列后表大小将如何增加。

我使用以下默认值:NULL, ''(空字符串)和some text(一些随机文本)`但似乎表大小没有改变。

我正在使用以下语句:

EXEC sp_spaceused '[Table_A]';

ALTER TABLE [dbo].[Table_A]
ADD [Loops] NVARCHAR(900)
CONSTRAINT [DF_Loops] DEFAULT('XXX') WITH VALUES;

EXEC sp_spaceused '[Table_A]';

ALTER TABLE [dbo].[Table_A]
DROP CONSTRAINT [DF_Loops]

ALTER TABLE [dbo].[Table_A]
DROP COLUMN [Loops];
Run Code Online (Sandbox Code Playgroud)

sp_spaceused总是返回:

name                                               rows                 reserved           data               index_size         unused
------------------------------------------------- -------------------- ------------------ ------------------ ------------------ ------------------
Table_A                                            73540994             8701688 KB         6658544 KB         2042976 KB         168 KB
Run Code Online (Sandbox Code Playgroud)

谁能告诉我做错了什么?

ype*_*eᵀᴹ 9

您添加了一个新列,但 SQL Server - 如果默认值是运行时常量 - 不会更新保存表数据的现有页面,这只是元数据更改,这就是您看不到增加的原因使用的空间。

出于所有意图和目的(正如 Aaron 在评论中提到的),价值观就在那里 - 并且SELECT会揭示它们。

将其视为 SQL-Server 黑魔法。它设法将信息存储在 0 字节中。Remus Rusanu 有一篇关于此优化的不错的博客文章,以及有关后台发生的(魔术)以及随后更新列的更多详细信息:
SQL Server 2012 中添加值列的在线非 NULL

关于它的基本信息,在 MSDN 文档中,ALTER TABLE

添加NOT NULL列作为在线操作

从 SQL Server 2012 企业版开始,当默认值为运行时常量时,添加NOT NULL具有默认值的列是在线操作。这意味着无论表中的行数如何,操作几乎都是立即完成的。这是因为表中的现有行在操作期间没有更新;相反,默认值仅存储在表的元数据中,根据需要在访问这些行的查询中查找该值。这种行为是自动的;不需要额外的语法来实现在线操作之外ADD列语法。运行时常量是一个表达式,它在运行时为表中的每一行生成相同的值,而不管其确定性如何。例如,常量表达式'My temporary data'或系统函数GETUTCDATETIME()是运行时常量。相反,函数NEWID()orNEWSEQUENTIALID()不是运行时常量,因为为表中的每一行生成一个唯一值。