我运行了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;
您是否需要将此作为生产能力,定期执行?或者这是一次性的事情? – 2012-04-16 20:57:36
这只需要完成一次 – user1337121 2012-04-16 21:15:23