我運行了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