2014-02-19 52 views
1

我的目標RDBMS是SQL Server 2012 - 但我對此處的一般響應感興趣。WHERE在執行SQL UPDATE之前過濾的好處

讓我們看看下面的SQL UPDATE子句:

UPDATE MyTable SET Active = 0 WHERE EffectiveDate < GETDATE() 

假設可能有很多條目MyTable的其中活動已經被設置爲「0」的往事,會不會有任何巨大的性能優勢以這種方式執行更新?

UPDATE MyTable SET Active = 0 WHERE EffectiveDate < GETDATE() AND Active = 1 
+4

取決於您的索引是如何製作的。 – Crono

+0

Crono - 我高度懷疑可能是這種情況。我猜測在這樣的情況下,一般的「最佳做法」是使用我的第二個變體 - 對嗎? – DanP

+0

可能,是的。但是如果你的表有數百萬條記錄,並且活動字段上沒有索引,那麼你可能會開始感覺到不同。我建議你確保Active字段先被索引,然後是你的第二個變體將是最好的方法。 – Crono

回答

3

你將不得不寫少(可能爲你的國家,最重要的是已經0?)少更新索引,如果你有指標上Active

+0

我認爲你已經觸及了我的主要觀點 - 如果列已經具有所需的值,SQL Server實際*執行*寫操作嗎?我不確定(一般情況下)是否足夠聰明地實現這些類型的優化。 – DanP

+0

即使值相同,也會寫入。 – Crono

+3

@Crono - 除非更新CI密鑰或使用快照隔離,否則通常不會。請參閱[非更新更新的影響](http://sqlblog.com/blogs/paul_white/archive/2010/08/11/the_2D00_impact_2D00_of_2D00_update_2D00_statements_2D00_that_2D00_don_2D00_t_2D00_change_2D00_data.aspx) –

0

是的,它會!

正如您所說的,有許多條目與Active = 0,因此限制更新查詢只有沒有活動= 0的記錄將意味着有更少的查詢。

3

可能最大的節約是在寫日誌。每行更新都會生成日誌記錄。通過更新更少的行,您將記錄更少的更改。

正如不久前在另一個問題中指出的,避免這些更新可以簡化觸發器的一些神祕方面。 「update(column)」語法會將該列標識爲正在修改,即使該值沒有更改。

+1

不要嘮叨,但不管WHERE子句如何,觸發器中的更新函數都會返回相同的結果。 :)仍然,日誌大小+1。 – Crono

+1

觸發器是每個語句,而不是每行。 'update(column)'只是簡單地返回'true',如果'column'完全被賦值的話。 –

1

要添加一個點到其他答案:如果您有更新觸發器,將會有一個區別,因爲它只會觸發滿足WHERE條件的行。根據觸發內容的不同,這可能會導致不良影響。

相關問題