根据执行计划,这两个查询是不同的。例如,查询:
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已经在寻求的索引排序可能会导致相同的查询计划。
他们是不一样的! – 2012-01-30 20:49:19
您是否先检查过查询计划?如果你关心这么小的差异,我相信你有分析仪。它会告诉你排序是否发生。 – artificialidiot 2012-01-30 20:50:28
我会从任何可交换的聚合函数(如COUNT或SUM)中删除排序子句,只是因为它是不必要的。 – 2012-01-30 21:02:00