我很好奇的是,很久以前一个人告诉我,count('quoted strin')
的性能优于count(*)
差(“引号字符串”)
我的意思是,使用select count('quoted string')
而不是select count(*),
,原因是count(*)
经历了所有列并降低了性能,其他人告诉我没有区别......但如果这是真的,这是否意味着count('quoted string')
与对一个的计数相同的列?
谢谢。
我很好奇的是,很久以前一个人告诉我,count('quoted strin')
的性能优于count(*)
差(“引号字符串”)
我的意思是,使用select count('quoted string')
而不是select count(*),
,原因是count(*)
经历了所有列并降低了性能,其他人告诉我没有区别......但如果这是真的,这是否意味着count('quoted string')
与对一个的计数相同的列?
谢谢。
计数( '任何引用字符串')或任何常量表达式或文字是等价的。引擎不需要访问任何列来计算行数。您可以使用EXPLAIN PLAN进行确认。
由于后者受空值的影响,因此计数总计行数(基数)优先于计数(col),因此更为可取。 (1)和count(*)(不含引号)之间没有任何区别,因为任何数值的数据库优化器都认可count(*)作为行数的请求,并且不会像所预期的那样访问所有列。
区别在于count(1)/ count(*)/ count('*')与count(col)之间,后者同样会查找col的非空值行。
这是由ANSI SQL标准规定的。个人而言,我认为count(1)或count(*)是可以接受的,但count('*')形式很差,可能会混淆,并且/或者由于混淆首先出现。我从来没有真正看过它的使用,如果有人认为这是一个表演“伎俩”,他们只是困惑和不知道常量表达式的影响。
SQL执行计划告诉我们它是一样的。您可以在将来自行检查。 Open Managment Studio:New Query->Include Actual Execution Plan
- >利润!
你也可以用Ctrl + M激活它。
没有实际差异,因为'*'是一个静态值,如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
是的我知道,伯爵('*')就是这个例子,但可以是('a')或其他什么,我已经改变了帖子更清晰。 – mpacheco 2014-10-10 11:13:26
Gotcha。任何常量表达式都是一样的。 – codenheim 2014-10-10 11:16:12
听起来很合理! – mpacheco 2014-10-10 11:18:26