我们有 2 个完全相同的数据库环境。第二个环境包含生产数据库的副本,并在 Invoice 表中托管大约 11M 条记录。此环境的目标用于查看特定升级查询需要多长时间才能知道是否会有任何停机时间(因为表在架构更改期间被锁定)
在第二个环境中执行 add 语句时
alter table Invoice add IsVerified bit not null default(0)
查询立即退出,这很奇怪,因为其中有 11M 条记录。我预计至少会有一点延迟。即使是选择计数(*)也需要更长的时间。然而,在主生产数据库上,它需要更长的时间,超过 30 秒,因此我们必须将此查询计划到一个特殊的维护窗口中。在执行查询时,没有任何东西阻塞 SPID(使用 sp_who2 检查)
可能是什么原因,数据库的第二个副本似乎根本没有努力在 11M 记录数据库中添加一列,而另一个 maindb 无法及时完成(<30 秒)。也许一些特殊设置允许您添加一个默认值列而不需要写入所有记录?难道是因为我们的测试环境是开发版,而生产环境是标准版?也许开发版中的某些特殊功能在 SQLStandard 中不可用?
select count(*) from Invoice //result: 11701200
SQL Server Execution Times:
CPU time = 2375 ms, elapsed time = 608 ms.
要添加的脚本:
alter table Invoice add IsVerified bit not null default(0)
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 12 ms.
将 NOT NULL 列添加为联机操作
在线架构更改仍然是 SQL Server 2019 (15.x) 的一项企业功能,因此您可以在 Developer 版本上执行在线操作,而在 Standard 版本上则离线执行。