我对 ALTER COLUMN 进行了测试,显示了进行更改所需的实际时间。结果表明,ALTER COLUMN不是瞬时的,所需时间呈线性增长。
RecordCt Elapsed Mcs
----------- -----------
10000 184019
100000 1814181
1000000 18410841
我的建议是按照你的建议批量处理。创建一个新列,并随着时间的推移使用ROWCOUNT和WAITFOR的组合预填充该列。
对脚本进行编码,以便从表中读取 WAITFOR 值。这样,您可以在生产服务器开始陷入困境时即时修改 WAITFOR 值。您可以在非高峰时段缩短 WAITFOR。(您甚至可以使用 DMV 使您的 WAITFOR 值自动生成,但这肯定更复杂。)
这是一个复杂的更新,需要计划和大量的保姆。
抢
这是 ALTER COLUMN 测试代码。
USE tempdb;
SET NOCOUNT ON;
GO
IF EXISTS (SELECT * FROM sys.tables WHERE [object_id] = OBJECT_ID('dbo.TestTable'))
DROP TABLE dbo.TestTable;
GO
CREATE TABLE dbo.TestTable (
ColID int IDENTITY,
ColTest int NULL,
ColGuid uniqueidentifier DEFAULT NEWSEQUENTIALID()
);
GO
INSERT INTO dbo.TestTable DEFAULT VALUES;
GO 10000
UPDATE dbo.TestTable SET ColTest = ColID;
GO
DECLARE @t1 time(7) = SYSDATETIME();
DECLARE @t2 time(7);
ALTER TABLE dbo.TestTable ALTER COLUMN ColTest bigint NULL;
SET @t2 = SYSDATETIME();
SELECT
MAX(ColID) AS RecordCt,
DATEDIFF(mcs, @t1, @t2) AS [Elapsed Mcs]
FROM dbo.TestTable;