2011-12-06 29 views
1

位長時間拍攝時提高更新性能,但我有下面一個簡單的查詢:設置列在這裏空

begin transaction  

update s 
set s.SomeField = null 
from someTable s (NOLOCK) 

rollback transaction 

這個運行在〜30秒坐在靠近SQL Server框中。有什麼技巧可以用來提高速度嗎?該表有144,306行。

謝謝。

+0

IsField是索引的一部分嗎?如果你不回滾會發生什麼?大部分時間是否回滾,還是將它歸零? – dasblinkenlight

+0

是的,它是索引的一部分。回滾增加約10秒的時間。還有20秒似乎太多了。 –

+0

'從someTable(NOLOCK)'是完全沒有意義的。它不會減少鎖定的數量,只需使用'update someTable set SomeField = null' –

回答

1

如果沒有約束,並且您確實需要將該列的所有值設置爲NULL,那麼我會測試刪除列並重新添加它。

不知道這是否會更快,但我會調查它。

+0

好主意,我會研究一下。 –

+0

不行。此列由多個索引引用。不會放棄索引並重新創建它們。這將需要更長的時間。 –

1
+0

重新啓用意味着需要重建索引。 –

+0

@MartinSmith這是絕對正確的。但是,一次重建索引可能比將索引的更新與表更新混合起來要便宜。我並不是說它必然會提供改進,但它有足夠的機會成功嘗試。 – dasblinkenlight

+0

禁用/重建(幾秒鐘)可以提高性能。 –

0

嘗試實現這樣

Disable Index 

Drop the column 
Create the column 

Rebuild index 

我可以猜測,它會提高性能。

+0

除了看起來額外的刪除/創建列和索引的額外開銷之外,這與上述答案有何不同? –

2

像這樣的大型UPDATE命令的性能的一個最大組件就是數據庫日誌的速度。

爲了獲得最佳性能:

  1. 確保DB日誌(LDF文件)是從DB數據(MDF文件)一個單獨的物理主軸
  2. 避免奇偶校驗RAID日誌卷,如RAID-5; RAID-1或RAID-10更好
  3. 確保數據庫日誌文件是預先生成的,並且它在磁盤上物理上連續不斷
  4. 確保您的服務器有足夠的RAM - 理想情況下,至少足夠容納所有包含修改行

使用SSD爲您的數據驅動器還可以幫助,因爲該命令將創造大量的髒緩衝區,後來由惰性寫入刷新到磁盤的DB頁;這可以使數據庫上的其他操作在發生時變慢。