给定一个任意的sql查询:
select foo from bar
这个sql查询可能非常复杂,那么我想知道这个查询的记录大小,所以我只是这样包装:
select count(*) from (select foo from bar) t
我应该这样做吗?除了使用count(*)
修改
抱歉忘记提及:表现是我的主要关注点。
答案 0 :(得分:1)
COUNT(*)是计算行数的最快方法,因为它除此之外别无其他。
如果用COUNT(col)替换它,无论col是否被索引,dbms都必须检查col中的每个值为null,因为不计算空值。所以这不能比COUNT(*)更快。如果col不可为空,则dbms可能会注意到这一点并跳过空测试。然后你回到COUNT(*)那样做。
所以你总是使用COUNT(*)。当你想要计算非空出现时,你只能使用COUNT(col) - 或者COUNT(DISTINCT col)来计算那个问题的不同值。
(顺便说一句:你也不会使用COUNT(1),因为在这里你告诉dbms"创建"每个记录1个并测试它为null。好吧,1永远不会为空,所以即使是最简单的dbms通常会注意到这一点并跳过null测试。但是为什么不首先写COUNT(*)?)
答案 1 :(得分:0)
Specefic SQL Server
:COUNT
是唯一考虑NULL
标记的聚合函数。因此,如果您只想处理foo
列中的已知值或select
列表中的任何其他列,请使用COUNT(COLUMN)
,否则请转到COUNT(*)
。