使用ORDER BY选择COUNT(*)

时间:2012-01-30 20:45:35

标签: sql oracle count

以下两个查询是否会以相同的方式执行?

SELECT COUNT(*) from person ORDER BY last_name;

SELECT COUNT(*) from person;

无论哪种方式,他们都应该显示相同的结果,所以我很好奇ORDER BY是否会被忽略。

我问的原因是因为我正在显示一个分页表,我将从数据库中一次获取20条记录,然后触发第二个查询来计算记录总数。我想知道我是否应该使用与第一个查询相同的标准,或者我是否应该从标准中删除所有排序?

3 个答案:

答案 0 :(得分:11)

根据执行计划,两个查询不同。例如,查询:

select count(*) from USER

会给我:

INDEX (FAST FULL SCAN)  3.0 3   453812  3457        1   TPMDBO  USER_PK FAST FULL SCAN  INDEX (UNIQUE)  ANALYZED

如您所见,我们点击USER_PK,这是该表的主键。

如果我按非索引列排序:

select count(*) from USER ORDER BY FIRSTNAME --No Index on FIRSTNAME

我会得到:

TABLE ACCESS (FULL) 19.0    19  1124488 3457    24199   1   TPMDBO  USER    FULL    TABLE   ANALYZED    1

意思是我们进行了全表扫描(更高的节点成本)

如果我按主键(已经是索引)排序,那么Oracle足够聪明,可以使用索引进行排序:

INDEX (FAST FULL SCAN)  3.0 3   453812  3457    13828   1   TPMDBO  USER_PK FAST FULL SCAN  INDEX (UNIQUE)  ANALYZED

这与第一个执行计划非常相似。

所以,你的问题的答案绝对不是 - 它们不一样。但是,按照Oracle已经在寻求的索引进行排序可能会导致相同的查询计划。

答案 1 :(得分:1)

当然不是。除非姓氏是主键,否则您已按此命令。

答案 2 :(得分:1)

Oracle查询优化器实际上对第一个版本执行了排序(我对此解释了解释计划),但由于两个查询只返回一行,因此性能差异非常小。

修改

迈克的回答是正确的。性能差异可能很大。