向表添加列是否会增加事务日志大小 (SQL Server)?

Man*_*l K 2 sql-server transaction-log

我用谷歌搜索并阅读了很多内容,但找不到这个简单问题的明确答案:向表中添加空列是否会增加 SQL Server 中的事务日志大小?

我这么问是因为我们想向现有表添加一个新的 int/bigint 列。该数据库在我们的客户提供的服务器上运行,因此我们希望做好准备。一些客户的表中将有数十亿条记录。

DDL语句:

ALTER TABLE example
ADD id_new int;
Run Code Online (Sandbox Code Playgroud)

额外问题:是否可以提前知道数据类型和行数来计算所需的事务日志大小?

提前致谢!

AMt*_*two 7

向表中添加空列是否会增加 SQL Server 中的事务日志大小?

有时。

如果您要向NOT NULL具有默认约束的表添加列,则该列可能仅包含元数据,并且不使用重要的日志大小。如果您使用的是 SQL Server 2012+ 和 Enterprise Edition,则添加列可能是仅在线元数据操作。

类似地,添加没有默认约束的NULL可能是在线仅元数据操作。

有时不是。

在 SQL Server 2012 之前,当您NOT NULL向现有表添加具有默认约束的新列时,表中的每一行都会更新以添加新列的默认值,从而导致完全记录数据大小操作桌子。如果在添加 NOT NULL 列时不使用 Enterprise 或 Developer 版本,则对于 2012+ 也是如此。

如果表包含任何SPARSE列,则将阻止添加列在任何情况下联机(即使在上述情况下通常允许)。某些其他已弃用的功能/数据类型也可能会阻止将列添加为仅元数据 - 已弃用功能的性质意味着在添加新功能时不一定会考虑它们,因此它们可能兼容也可能不兼容。

同样,如果您使用复制或更改跟踪,这些“跟踪我的所有更改”技术的配置可能会阻止更改在线进行。如果您正在使用其中任何一个,您将需要检查和测试。

是否可以提前知道数据类型和行数来计算所需的事务日志大小?

所有架构更改都将使用一些事务日志。

如果添加列符合仅元数据操作的要求,则事务日志的使用量将是最小的。

如果添加列不符合仅元数据操作的条件,则该事务将是数据大小操作,这意味着 SQL Server 本质上将在单个事务中重写完全记录的表,并且需要事务日志空间来做到这一点。

此外,由于数据大小操作可能会长时间运行,因此在事务运行时,SQL Server 将无法释放事务日志的任何部分以供重用。如果添加列需要 2 小时,则您的事务日志需要足够大,以容纳与该架构更改相关的数据,以及与您的架构更改同时运行的所有其他事务,并遵循正常的日志重用规则。请注意,即使在简单恢复中,SQL Server 也只会在最旧的打开事务开始之前清除并重用事务日志 - DDL 和所有并发活动将保留在日志中,直到 DDL 语句完成。

因此,所需的事务日志量是数据大小架构更改和同时运行的所有其他内容的总和。这意味着在非生产环境中进行测试可能会导致您低估事务日志的使用情况,因为缺乏并发工作负载可能会影响记录的工作量以及总持续时间。

如果您只想在零并发的数据库上执行架构更改,您会发现测试可以提供不错的估计,但即使如此,由于逻辑上相同的数据可能会变化的因素数量很多,因此精确的计算也很困难(磁盘大小、碎片、低页面填充/页面密度等)。