我很好奇,很久以前有人告诉我count('quoted strin')
的表现优于count(*)
我的意思是,使用select count('quoted string')
代替select count(*),
,原因是count(*)
遍历所有列并降低了性能,其他人告诉我没有区别......但如果这是真的,这是否意味着count('quoted string')
与其中一列的计数相同?
谢谢。
答案 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激活它。