2015-12-21 23 views
2

我在我們的Microsoft SQL Server中的單個表中有大量的行。我可以編寫SQL腳本來更新SQL Server中的單個表的所有行,但分批嗎?

我需要在表中添加一個新列(DateTime)。精細。該列需要爲NOT NULL。好的。現在,這就是問題所在:

它的時間太長設置所有列值所有

我試圖創建可空列。這花了納秒。然後將UPDATE的所有行設置爲GETUTCDATE()

例如。

DECLARE @foo = GETUTCDATE(); 

UPDATE PewPew 
SET NewField = @Foo 

2小時後,我不得不取消查詢。是的,2個小時。我也沒有這樣做,在TRANSACTION。然後我放棄了新的領域,我們回到了我們開始的地方。

我想可能我們

  1. 創建NULLABLE列
  2. 在1000或東西批次,更新前1000列,其中新野爲NULL。

一旦全部完成,然後改變列,使其不可空

的SQL Server是在Azure上 - 這是一個標準的D13(8個核,56 GB內存)VM,我認爲我們把它在SSD上,所以我想認爲硬件不是太糟糕。

腳註:大量的行數=我認爲大約是2000萬。這對我們來說很大,但對一些人來說並不大。我們明白了。

+1

考慮事務日誌以及參考:http://dba.stackexchange.com/questions/60789/what-are-the-most-effective-techniques-to-reduce-sql-server-disk-space-use - 當 –

+0

你能分享你的餐桌設計嗎? Azure上20m @ 2+小時感覺緩慢。 –

回答

2
select 1; 
while(@@RowCount<>0) 
begin 

    update top(1000) PewPew set NewField = getutcdate() WHERE NewField IS NULL; 
end 

這將一次更新1000行。

+0

對於這個解決方案,建議首先在'NewField'上創建一個'INDEX',否則每個更新批次將掃描整個表格。之後您可以放棄索引。 –

+0

@tt索引插入不是免費的。我敢打賭,索引維護將花費比掃描更長的時間。 – Paparazzi

+0

@ pure.krome將它標記爲答案,如果你覺得合適。 –

1

如果將新列添加爲NOT NULL默認約束會怎樣?

ALTER TABLE dbo.YourTable 
ADD NewColumn DATETIME2(3) NOT NULL 
    CONSTRAINT DF_YourTable_NewColumn DEFAULT (SYSUTCDATETIME()) 

應該添加該列,如NOT NULL,並立即填入默認值。不知道這是否會比你的UPDATE更快運行 - 值得一試。

+0

這將有效地工作 – Hemal

+0

這是我原來的嘗試,但它需要很長也:( –

相關問題