2012-01-30 64 views
8

的SELECT COUNT(*)以同样的方式执行以下两个查询吗?带有ORDER BY

SELECT COUNT(*) from person ORDER BY last_name;

SELECT COUNT(*) from person;

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

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

+0

他们是不一样的! – 2012-01-30 20:49:19

+0

您是否先检查过查询计划?如果你关心这么小的差异,我相信你有分析仪。它会告诉你排序是否发生。 – artificialidiot 2012-01-30 20:50:28

+0

我会从任何可交换的聚合函数(如COUNT或SUM)中删除排序子句,只是因为它是不必要的。 – 2012-01-30 21:02:00

回答

10

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

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

当然不是。除非姓是主键,并且您已经按此命令排序。

+0

我不认为答案是显而易见的。 Oracle经常会抛出无用的步骤,尤其是不必要的排序。我最初希望这两个查询以同样的方式运行。 – 2012-01-31 04:38:56

+0

它可能不是很明显,但似乎这是正确的答案。 – Sid 2012-01-31 14:41:25

1

Oracle查询优化器实际上对第一个版本执行排序(我对此进行了验证),但由于两个查询只返回一行,所以性能差异将非常小。

编辑:

小李的答案是正确的。性能差异可能很大。

+2

SORT ORDER BY'正在排序,'SORT AGGREGATE'没有真正的排序。尽管查询返回的行数相同,但性能差异仍然很大。 – 2012-01-31 04:41:02