2008-09-23 108 views
1

我有一張表格,裏面包含了關於遊戲中城市的信息,每轉一圈就可以建造一座建築物,並且記錄的值爲「usedBuilding」。盲目更新或更新位置?

每回合我將運行它改變usedBuilding 0的腳本,問題是,它的以下兩種方式速度更快,不管它實際上是用哪種方式?

UPDATE cities SET usedBuilding = 0; 
UPDATE cities SET usedBuilding = 0 WHERE usedBuilding = 1; 

回答

4

一般而言,第二殼體(與WHERE)子句會更快 - 因爲它不會造成在不使用的行觸發評估,事務日誌記錄,索引更新等。

潛在的 - 這取決於0/1值的分佈,它實際上是更快地更新所有的行,而不是做比較 - 但是這是一個漂亮的退化情況。

由於大約95%的查詢成本是I/O,因此使用WHERE子句將不會產生任何影響(因爲列未編入索引,而且您正在執行表掃描)或者存在巨大差異(如果列被索引,或分區表等)。無論哪種方式,它都沒有傷害。

我懷疑對於你說的數據量,你不會注意到任何執行計劃或速度的差異 - 這使得它最好是學術性的,最壞的情況是過早優化。所以,我建議採用任何符合您的應用的邏輯意義。

3

如果usedBuilding被索引,這將是更快地使用WHERE子句,因爲它只會訪問/更新行,其中usedBuilding是真實的。 如果它沒有編入索引,那麼您仍然會進行全表掃描,所以它不會產生太多(任何?)差異。

1

好像會有一個較低的數字交易使「UPDATE城市設立usedBuilding = 0;」執行比更具體的查詢。我能想到的主要原因是如果你的專欄有多個州。如果它僅僅是一個布爾值,那麼它就沒問題,但是你可能想花一些時間來思考這是否會一直如此。

索引還可以使執行計劃使用WHERE子句更高效。

1

獲得明確答案的最佳方法是在不同場景下使用大量示例數據進行配置文件。

3

在循環中嘗試兩種方法幾千次並計時! 這可能取決於:該表中實際有多少記錄,以及它們是否都適合內存或是否必須分頁到磁盤。在運行更新之前,有多少建築物的值爲1(我猜這可能是1)。

使用哪種方式並不重要,但最短的一個可能會得到最少的錯誤。你不寫的代碼不能有錯誤。

+1

「傳統」分析通常比在RDBMS土地無用少。你*有*查看查詢計劃和統計數據,而不是盲目計時。另外,一般來說,您可以爲RDBMS提供* more *數據,代表您可以進行更好的優化。 – 2008-09-24 23:06:58

1

索引不會幫助你,除非你有可能使用usedBuilding = 1值的2%。

但是,這兩個語句在邏輯上是不同的,可能意味着完全不同的東西。 但如果你的情況是相同的,那麼使用沒有where子句的那個。

2

這些轉折發生的頻率如何?你預計在這個表中有多少行?如果答案是「每秒少於一次」和「少於10000次」,那麼不要擔心。

除非你碰巧在這方面有某種學術興趣,當然。

1

你準備好幾行?我懷疑,對於一個小型的網絡遊戲,你真的不在乎。

如果您對「城市」表進行了多次更新,如果可能的話,在一個UPDATE語句中完成它們可能是一個好主意。

對行進行任何更改可能需要與寫入整個行一樣多的I/O(當然,更新索引列除了需要索引寫入外),因此您可以通過創建多個觸發大量行的UPDATE操作而失敗。

但如果你有,比如說,< 1000行,你真的不在乎:)