位長時間拍攝時提高更新性能,但我有下面一個簡單的查詢:設置列在這裏空
begin transaction
update s
set s.SomeField = null
from someTable s (NOLOCK)
rollback transaction
這個運行在〜30秒坐在靠近SQL Server框中。有什麼技巧可以用來提高速度嗎?該表有144,306行。
謝謝。
位長時間拍攝時提高更新性能,但我有下面一個簡單的查詢:設置列在這裏空
begin transaction
update s
set s.SomeField = null
from someTable s (NOLOCK)
rollback transaction
這個運行在〜30秒坐在靠近SQL Server框中。有什麼技巧可以用來提高速度嗎?該表有144,306行。
謝謝。
如果沒有約束,並且您確實需要將該列的所有值設置爲NULL,那麼我會測試刪除列並重新添加它。
不知道這是否會更快,但我會調查它。
好主意,我會研究一下。 –
不行。此列由多個索引引用。不會放棄索引並重新創建它們。這將需要更長的時間。 –
重新啓用意味着需要重建索引。 –
@MartinSmith這是絕對正確的。但是,一次重建索引可能比將索引的更新與表更新混合起來要便宜。我並不是說它必然會提供改進,但它有足夠的機會成功嘗試。 – dasblinkenlight
禁用/重建(幾秒鐘)可以提高性能。 –
你可以稍微改變你的查詢的語法,但是通過這樣做我的測試沒有什麼區別。我使用的是STATISTICS IO
和STATISTICS TIME
。
您提到該列已編入索引。你可以禁用它/重新啓用它作爲你的交易的一部分。 t-sql很簡單,看到這個 - http://blog.sqlauthority.com/2007/05/17/sql-server-disable-index-enable-index-alter-index/
我不得不在過去做類似的工作,它對我來說工作得很好。
嘗試實現這樣
Disable Index
Drop the column
Create the column
Rebuild index
我可以猜測,它會提高性能。
除了看起來額外的刪除/創建列和索引的額外開銷之外,這與上述答案有何不同? –
像這樣的大型UPDATE命令的性能的一個最大組件就是數據庫日誌的速度。
爲了獲得最佳性能:
使用SSD爲您的數據驅動器還可以幫助,因爲該命令將創造大量的髒緩衝區,後來由惰性寫入刷新到磁盤的DB頁;這可以使數據庫上的其他操作在發生時變慢。
IsField是索引的一部分嗎?如果你不回滾會發生什麼?大部分時間是否回滾,還是將它歸零? – dasblinkenlight
是的,它是索引的一部分。回滾增加約10秒的時間。還有20秒似乎太多了。 –
'從someTable(NOLOCK)'是完全沒有意義的。它不會減少鎖定的數量,只需使用'update someTable set SomeField = null' –