2011-08-19 33 views
12

可能重複:
Count(*) vs Count(1)SQL最佳實踐:計數(1)或COUNT(*)

我記得有傳言稱被告知:

從未使用count( *)當計數(1)將做

最近我把這個建議傳給了另一個開發者,並且被證明這是真的。我的觀點是我得到建議時告訴我的:數據庫只會返回第一列,然後將被計數。反駁是數據庫不會評估括號中的任何內容。

從小桌子上的一些(不科學的)測試看來,似乎沒有區別。我目前無法訪問任何大型表格進行試驗。

我在使用Sybase時得到了這個建議,而且表有數以百萬計的行。我現在正在使用Oracle,而且數據少得多。

所以我想總的來說,我的兩個問題是:

  1. 這是更快,計數(1)或COUNT(*)?
  2. 這會因不同的數據庫供應商而有所不同嗎?
+1

1. ANSI SQL定義'COUNT(*)'應該優化2.這適用於大多數RDBMS。別的僅適用於舊版本的*另有說明,否則*承擔COUNT(*)進行了優化。 – gbn

回答

13

根據另一個類似的問題(Count(*) vs Count(1)),它們是相同的。

在Oracle中,根據Ask Tom,count(*)是計數行數的正確方法,因爲優化程序將count(1)更改爲count(*)。計數(1)實際上意味着計算與非空1的(他們都是非空,因此優化器將改變你)行。

+0

+1添加Oracle鏈接 – gbn

-3
  1. 計數(1)
  2. 沒有,通常來說這總是會有表現略好。

這隻會影響如果放大到一個很大的數額,但這是一個很好的做法。

+3

不,不。神話。 -1。除了重複之外,您還可以在[DBA.SE](http://dba.stackexchange.com/questions/2511/what-is-the-difference-between-select-count-and-select-countany -non-null-col/2512#2512) – gbn

+1

我認爲這樣做是正確的,因爲count(1)總是會有稍微好一點的性能。 – hatchet

+2

您是否有任何文件支持這種違反傳統智慧的行爲? – dkretz

4

在閱讀專門針對TSQL和Microsoft SQL Server的書籍時,我已經讀過使用*更好,因爲它可以讓優化器決定最佳做法。我會盡力找到具體書籍的名稱並在這裏發佈。

+0

這也適用於使用「exists(select * from ...)」與「exists(從...中選擇字段)」 –

+0

count(*)是一種常見的習慣用法,任何優化器應該考慮到它,而不僅僅是SQL Server。我希望我有證據支持這一點。 –

+0

@Mark Ransom:在ANSI標準中http://dba.stackexchange.com/questions/2511/what-is-the-difference-between-select-count-and-select-countany-non-null-col/2512 #2512 – gbn

3

這是一個基本的查詢模式,其含義是相同的。我不止一次讀過優化器對待它們 - 現在找不到具體的參考資料,但將其放在「機構知識」的類別中。

(應搜索的第一個... HTTP://stackoverflow.com/questions/1221559/count-vs-count1)

1

據我所知使用count()應該會更快,因爲當函數被稱爲引擎只計算索引。從另一個角度來看,二進制代碼中計數()和count(1)看起來非常相似,所以應該沒有區別。

2

我只能到SQL Server說話,但在測試在5 GB表,11毫米記錄 - 的讀操作數和執行計劃是相同的。

我說沒有區別。