変更を行うために必要な実際の時間を示すALTERCOLUMNのテストを実行しました。結果は、ALTER COLUMNが瞬時ではなく、必要な時間が直線的に増加することを示しています。
RecordCt Elapsed Mcs
----------- -----------
10000 184019
100000 1814181
1000000 18410841
私の推奨は、あなたが提案したようにそれをバッチ処理することです。新しい列を作成し、 ROWCOUNTとWAITFORの組み合わせを使用して、時間の経過とともに列に事前入力します。
WAITFOR値がテーブルから読み取られるように、スクリプトをコーディングします。そうすれば、本番サーバーがダウンし始めたときに、WAITFOR値をオンザフライで変更できます。オフピーク時にWAITFORを短縮できます。(DMVを使用してWAITFOR値を自動化することもできますが、これは確かにより複雑です。)
これは複雑な更新であり、計画と多くのベビーシッターが必要になります。
ロブ
これがALTERCOLUMNテストコードです。
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;