2013-10-10 52 views
2

是這種說法真的還是假的UPDATE VS COUNT VS SELECT性能

這些查詢的性能

SELECT * FROM table; 

UPDATE table SET field = 1; 

SELECT COUNT(*) FROM table; 

相同

或者是有過這樣的情況,其中一個意志的表現與其他有很大不同?

UPDATE

  1. 我更感興趣,如果有在SELECT和更新之間較大的差異。如果需要,可以忽略COUNT(*)
  2. 假設select執行全表掃描。該更新還將對錶中的所有行執行更新。
  3. 假設更新只更新一個字段 - 雖然它會更新所有行(它是一個索引字段)
  4. 我知道他們會花費不同的時間,他們做不同的事情。我想知道的是如果差異會很大或不大。例如。如果更新將比選擇時間長5倍,那麼它是很重要的。將此用作閾值。而且沒有必要精確。只是給一個近似值。

回答

1

有不同的資源類型涉及:

  • 磁盤I/O(這是每個DBMS中最昂貴的部分)
  • 緩衝壓力:提取行將使從磁盤中獲取的網頁,這將需要緩衝存儲器將被存儲在
  • 工作/臨時存儲器用於中間表,結構和集合。
  • 「終端」I/O到前端進程。鎖定,序列化和版本控制和日誌
  • CPU成本
  • 成本:這是在大多數情況下忽略不計(相對於磁盤I/O)

在討論的UPDATE查詢是最難的:它會導致全部磁盤頁面被取出,放入緩衝區,更改爲新的緩衝區並寫回磁盤。在正常情況下,它也會導致其他流程被鎖定,因此爭用甚至更多的緩衝壓力。

SELECT *查詢也需要所有頁面;它需要將它們全部轉換/格式化爲前端格式並將它們發送回前端。

SELECT COUNT(*)是所有資源中最便宜的。在最壞的情況下全部必須提取磁盤頁面。如果存在索引,則需要更少的磁盤I/O和緩衝區。 CPU成本仍然可以忽略(恕我直言),「終端」輸出是邊際。

+0

你認爲UPDATE會比SELECT *大5倍嗎? – pillarOfLight

+0

這取決於。涉及的每個資源都是最終_formula_中的一個維度。而且每一個維度都需要一個權重因子來形成一個「x = c * y」類型的公式。 IOW:YMMV。對其他非相關查詢和進程(主要是WRT緩衝區,內存和鎖)也有一定的影響 – wildplasser

+0

如果我對限制進行更新,該怎麼辦?這會大大縮短所花時間嗎?例如,假設沒有限制,它將更新表中的所有500000行。將它限制爲1(因此只更新表中的1行)可以減少執行查詢所花費的時間? – pillarOfLight

0

SELECT和UPDATE應該大致相同(但它們可以很容易地變化,這取決於數據庫)。 COUNT(*)緩存在許多數據庫中,在某個級別上,因此查詢可以很容易地爲O(1)。當然,UPDATE的懶惰實現也可能是O(1),但我不知道任何人正在做這件事。

tl; dr:「假」或「取決於」。

1

所有這三個查詢做了很大不同的事情。

他們每個人都有自己的表現特徵,不能直接比較。

你能澄清你試圖調查什麼嗎?

4

當你說「表現」時,你的意思是「他們需要多長時間才能執行」?

  • 其中之一是返回所有行中的所有數據。
  • 其中之一(如果您刪除「FROM」)正在將數據寫入行。
  • 一種是對行進行計數並且不返回任何行中的數據。

所有這三個查詢都做了完全不同的事情。因此,有理由得出結論,他們三人將花費不同的時間來完成。

最重要的是,你爲什麼要問這個問題?你想要解決什麼問題?我有一種不好的感覺,就是你問這個問題會走錯路。

1

我在這裏有一個大的(授予索引)表在工作,這是我發現

SELECT * FROM X(限前10萬條記錄)(12。從X 5秒)

SELECT COUNT(*)(返回數百萬條記錄)(15.57秒)

更新上的索引表是非常快(小於一秒)