2014-10-10 49 views
0

我很好奇的是,很久以前一個人告訴我,count('quoted strin')的性能優於count(*)差(「引號字符串」)

我的意思是,使用select count('quoted string')而不是select count(*),,原因是count(*)經歷了所有列並降低了性能,其他人告訴我沒有區別......但如果這是真的,這是否意味着count('quoted string')與對一個的計數相同的列?

謝謝。

回答

2

計數( '任何引用字符串')或任何常量表達式或文字是等價的。引擎不需要訪問任何列來計算行數。您可以使用EXPLAIN PLAN進行確認。

由於後者受空值的影響,因此計數總計行數(基數)優先於計數(col),因此更爲可取。 (1)和count(*)(不含引號)之間沒有任何區別,因爲任何數值的數據庫優化器都認可count(*)作爲行數的請求,並且不會像所預期的那樣訪問所有列。

區別在於count(1)/ count(*)/ count('*')與count(col)之間,後者同樣會查找col的非空值行。

這是由ANSI SQL標準規定的。個人而言,我認爲count(1)或count(*)是可以接受的,但count('*')形式很差,可能會混淆,並且/或者由於混淆首先出現。我從來沒有真正看過它的使用,如果有人認爲這是一個表演「伎倆」,他們只是困惑和不知道常量表達式的影響。

+0

是的我知道,伯爵('*')就是這個例子,但可以是('a')或其他什麼,我已經改變了帖子更清晰。 – mpacheco 2014-10-10 11:13:26

+0

Gotcha。任何常量表達式都是一樣的。 – codenheim 2014-10-10 11:16:12

+0

聽起來很合理! – mpacheco 2014-10-10 11:18:26

0

SQL執行計劃告訴我們它是一樣的。您可以在將來自行檢查。 Open Managment Studio:New Query->Include Actual Execution Plan - >利潤!

你也可以用Ctrl + M激活它。

2

沒有實際差異,因爲'*'是一個靜態值,如1,'aaaa','b'等等。

但是,如果用列名替換'*',計數將只計數非空值。

SELECT COUNT(*) val1, COUNT('AAAA') val2, COUNT(col) val3 
FROM (values(1), (null), (3)) x(col) 

結果:

val1 val2 val3 
3  3  2