选择计数(*)和选择计数之间的差异('引用字符串')

时间:2014-10-10 11:00:57

标签: sql-server performance

我很好奇,很久以前有人告诉我count('quoted strin')的表现优于count(*)

我的意思是,使用select count('quoted string')代替select count(*),,原因是count(*)遍历所有列并降低了性能,其他人告诉我没有区别......但如果这是真的,这是否意味着count('quoted string')与其中一列的计数相同?

谢谢。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

count('任何带引号的字符串')或任何常量表达式或文字都是等效的。引擎不需要访问任何列来计算行数。您可以通过EXPLAIN PLAN确认。

计算总行数(基数)比计数(col)更可取和正确,因为后者受空值影响。

实际上,count(1)和count(*)(没有引号)之间没有区别,因为任何值得它的数据库的优化器都会将count(*)识别为对数量的请求行,并且不会像预期的那样访问所有列。

不同之处在于count(1)/ count(*)/ count(' *')vs count(col),后者同样会查找具有非null值的行为col。

这由ANSI SQL标准指定。

就我个人而言,我认为count(1)或count(*)是可以接受的,但是count(' *')是糟糕的形式,并且可能令人困惑,并且/或者在第一次出现混乱地点。我从来没有真正看过它的用法,如果有人认为这是一个表演"技巧",他们只是混淆而且不知道常数表达式的影响。

答案 2 :(得分:0)

SQL执行计划告诉我们它是一样的。您可以在将来自行查看。 Open Managment Studio:New Query->Include Actual Execution Plan - >利润!

您也可以使用Ctrl + M激活它。