2012-05-31 54 views
5

我正在寫一個大腳本,充滿每天運行的更新語句。其中一些更新會影響其他人不會的行。SQL Server的性能 - 如果選擇+更新與更新

我相信不會影響任何更新語句不是很好的做法,但我的問題是:

  • 有多差可以在此影響性能?這與選擇語句有非常大的區別,只有當選擇取得某些內容時才進行更新?

謝謝 蒂亞戈

+1

這取決於你的'WHERE'子句有多複雜。 'UPDATE'語句必須首先找出哪些行要更新 - 或者沒有。這可能涉及表掃描,如果你沒有適當的索引表。一如既往:**測試**,看看它有多糟糕。當然,最好確定那些真正需要更新的行,然後更新這些行。但是,確定這些行需要多少努力? –

+0

努力會涉及表變量,而不僅僅是一個或兩個......我說的是20個更新語句在腳本中一起運行並更新不同的表。在開發方面的努力不僅僅是開發更新語句。 關於更新中的where子句,其中大多數內部最多有一個或兩個內部連接,而簡單的「null」或「<> 0」則是子句。 –

回答

1

這取決於你是如何做的更新。如果您使用的是加入了語法(即)更新

UPDATE targetTable 
FROM targetTable INNER JOIN sourceTable 

然後你就可以非常簡單地添加WHERE子句只更新行,如果你想設置的值實際上是不同的。

是的,它可能會影響性能,特別是如果你認爲這樣的事情...

UPDATE targetTable SET column = column 

...將大火,已於UPDATE定義的觸發器。我並不是100%,但我相信這也會將其納入事務日誌中,因爲它需要進行維護,以便日誌尾部備份和鏡像目標能夠完整地組合事件序列。

+0

我會對觸發主題做進一步的研究,好點!但我不希望這張桌子上有很多觸發器。 –

1

如果你的意思是問是否有在性能方面UPDATE … WHERE conditionSELECT … WHERE the_same_condition + UPDATE … WHERE the_same_condition之間的差異,那我寧願希望後者比前者有效。無論是UPDATE還是SELECT,這些行仍然需要計算出來,並且在初步的SELECT … WHERE …中,如果遇到了問題,他們將不得不重新計算兩次。

但是@Matt Whitfield has got a point關於觸發器。如果更新時有觸發器,則無論是否更新了任何行,它都會觸發。並且如果觸發器確實是,即使沒有更新的行(並且您希望避免這種情況),然後要麼重寫觸發器,要麼使用SELECT + UPDATE + UPDATE方法。

+0

是的,這是我的問題,並從我在這裏的評論我非常保持僅更新的方法。只需檢查哪些表具有更新觸發器並查看這些表上的行爲。 謝謝! –

3

首先,SELECT和後面的UPDATE在併發下幾乎總是不正確的。除非事件在SERIALIZABLE隔離級別下運行,否則不能保證SELECT和UPDATE之間的行不會在之間更改

其次,對於行的情況進行更新時,SELECT + UPDATE的成本根據定義高於UPDATE。

最後,對於那些不是行來更新通過UPDATE查找它們的代價通常與通過SELECT查找它們的代價相同,所以你沒有獲得任何東西。我說'經常',而不是'總是',因爲查詢優化器可能會考慮更新與選擇不同的策略,並且在不同的鎖定(併發)規則下進行掃描以進行更新,而不是掃描讀取。

什麼可能是有道理的是有一個非常便宜的選擇,可以避免昂貴的更新,即使不是100%準確。 SELECT和UPDATE之間的條件可以大不相同只要你沒有得到任何錯誤的否定結果(SELECT表示不應該有任何行,但UPDATE會發現行,如果它已經運行)和假的數量積極性很低(SELECT表示有行,但更精確/昂貴的UPDATE檢查實際上沒有發現任何)。

歸根結底,這是一個優化的問題,所有的優化問題,通過測量開始。首先找到昂貴的更新,然後開始修改。