以下两个查询是否会以相同的方式执行?
SELECT COUNT(*) from person ORDER BY last_name;
和
SELECT COUNT(*) from person;
无论哪种方式,他们都应该显示相同的结果,所以我很好奇ORDER BY
是否会被忽略。
我问的原因是因为我正在显示一个分页表,我将从数据库中一次获取20条记录,然后触发第二个查询来计算记录总数。我想知道我是否应该使用与第一个查询相同的标准,或者我是否应该从标准中删除所有排序?
答案 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查询优化器实际上对第一个版本执行了排序(我对此解释了解释计划),但由于两个查询只返回一行,因此性能差异非常小。
修改强>
迈克的回答是正确的。性能差异可能很大。