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

时间:2014-11-18 08:58:09

标签: sql

给定一个任意的sql查询:

select foo from bar

这个sql查询可能非常复杂,那么我想知道这个查询的记录大小,所以我只是这样包装:

select count(*) from (select foo from bar)  t

我应该这样做吗?除了使用count(*)

之外,我应该依靠一些索引列吗?

修改


抱歉忘记提及:表现是我的主要关注点

2 个答案:

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