0

在SQL Server 2008/2012中,向大表(缺省爲null)添加空列或多或少是即時的。向大表添加非空列SQL Server 2012在不同服務器上的行爲有所不同

ALTER TABLE TableWithManyRows 
    ADD TestNull INT NULL; 

在SQL Server 2012中,這也應該是不空列被設置爲默認值的情況下 - 看http://rusanu.com/2011/07/13/online-non-null-with-values-column-add-in-sql-server-11/

下面的語句:

ALTER TABLE TableWithManyRows 
    ADD TestWithValues INT NOT NULL DEFAULT 0 WITH VALUES; 

運行更或在我的本地機器上立即執行,但在生產數據庫服務器上非常慢。

兩者都運行SQL Server 2012.運行「Null」版本對於兩者都是即時的,這只是非空的情況,我發現差異。

是否有配置選項可能會影響此?有關如何追蹤差異的其他建議?

解決方案(萬一有人不發現它在下面的評論)

我很困惑,因爲我在本地有開發版,其行爲類似於企業版。生產服務器沒有企業版。

+0

您的機器與服務器上的數據集有多大?總行數是多少? – 2014-03-13 12:11:23

+0

兩種情況下約500k行。 –

+0

如果其他進程在生產中同時觸發表,則您正在嘗試更改會大大影響性能的表。對於這樣大的事情,我會把它變成一項工作,在最慢的時間內在一個工作時間後運行一次。 – 2014-03-13 12:19:20

回答

1
ALTER TABLE TableWithManyRows 
    ADD TestNull INT NULL; 

沒有任何東西表中的記錄

ALTER TABLE TableWithManyRows 
    ADD TestWithValues INT NOT NULL DEFAULT 0 WITH VALUES; 

更新每隔記錄該列值0。隨着大量的數據,這將需要時間。

如果這是您的業務規則,那麼您可以做的不多。

+0

對於SQL-Server 2012,這不是真的 - 請參閱問題中的鏈接。 (2008年是這種情況)。 正如我所說,我看到不同的行爲在不同的服務器上有完全相同的聲明。 –

+0

,並且您確定這兩個警告都沒有被破壞「在新添加的列增加最大可能行大小超過8060字節限制的情況下,無法在線添加列,而且僅限企業版功能。」從診斷來看似乎很明顯,SS確實試圖更新每一行 –

+0

Jenson-button-event - 謝謝,你找到了它。本地我有開發者版,它具有企業版的所有功能。該服務器沒有Enterprise版本。 –

0

有很多事情可能導致這種情況。執行此操作需要鎖定表以進行更新。它還必須更新每行現有數據。如果您有多行數據(因爲生產數據庫通常比您的開發副本多),則需要更長的時間。另外,如果服務器處於高負載狀態並且許多人正在使用數據庫和表,那麼當系統等待對錶和/或數據行進行獨佔鎖以更新模式時,這也會導致性能下降,在每個現有行中設置值。

+0

開發副本使用500k行的表。如果我強制更新所有記錄(例如,調用Update TableWithManyRows Set TestWithValues = 1),那麼在我的開發機器上需要花費大量的時間。這不是由於dev和prod之間的表大小不同造成的。 –

相關問題