包装 sql 查询以执行行计数查询是否很好



给定任意 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 ServerCOUNT是唯一考虑NULL标记的聚合函数。因此,如果您只想处理foo列或列表中任何其他列中已知值select请使用COUNT(COLUMN)否则COUNT(*)

最新更新