给定一个任意的 sql 查询:
select foo from bar
这个sql查询可以很复杂,那么我想知道这个查询的记录大小,所以我就这样包装:
select count(*) from (select foo from bar) t
我应该这样做吗?除了仅使用
count(*)
之外,我是否应该依靠某些索引列?编辑:
抱歉忘了提这个:性能是我最关心的问题 .
最佳答案
COUNT(*) 是计算行数的最快方法,因为除此之外它什么都不做。
如果用 COUNT(col) 替换它,无论 col 是否被索引,dbms 都必须检查 col 中的每个值是否为空,因为空值不计算在内。所以这不能比 COUNT(*) 快。如果 col 不可为空,dbms 可能会注意到这一点并跳过空测试。然后你又回到了 COUNT(*) 所做的事情。
所以你总是使用 COUNT(*)。当您想计算非空出现的次数时,您只会使用 COUNT(col) - 或 COUNT(DISTINCT col) 来计算不同的值。
(顺便说一句:你也不会使用 COUNT(1),因为在这里你告诉 dbms 为每个记录“创建”一个 1 并测试它是否为空。嗯,1 永远不会为空,所以即使是最简单的 dbms 通常也会注意到这一点并跳过null 测试。但是为什么不首先写 COUNT(*) 呢?)
关于sql - 包装一个 sql 查询来做一个行计数查询是不是很好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26990217/