2014-10-10 51 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