给定任意 sql 查询:
select foo from bar
这个SQL查询可能非常复杂,那么我想知道这个查询的记录大小,所以我就这样包装它:
select count(*) from (select foo from bar) t
我应该这样做吗?我应该指望一些索引列,而不仅仅是使用count(*)
编辑:
对不起,忘了提这个:性能是我最关心的问题。
COUNT(*) 是计算行数的最快方法,因为它不执行任何其他操作。
如果将其替换为 COUNT(col),无论 col 是否被索引,dbms 都必须检查 col 中的每个值是否为 null,因为不计算 null。所以这不可能比 COUNT(*) 更快。如果 col 不可为空,dbms 可能会注意到这一点并跳过空测试。然后你又回到了 COUNT(*) 的作用。
所以你总是使用 COUNT(*)。只有当您想要计算非空事件时,才会使用 COUNT(col) - 或 COUNT(DISTINCT col) 来计算该事项的不同值。
(顺便说一句:你也不会使用 COUNT(1),因为在这里你告诉 dbms 为每个记录"创建"一个 1 并测试它的空值。好吧,1 永远不会为空,因此即使是最简单的 dbms 通常也会注意到这一点并跳过空测试。但是为什么不首先写 COUNT(*) 呢?
具体到SQL Server
:COUNT
是唯一考虑NULL
标记的聚合函数。因此,如果您只想处理foo
列或列表中任何其他列中已知值select
请使用COUNT(COLUMN)
否则COUNT(*)