sql查询的最右边的rownum和第二个右边的rownum有什么区别?或者您可以说如果我们交换rownum
select * from EMPLOYEE where FIRSTNAME = 'X' and rownum <5;
// Taking Less Time compare to next one in oracle
select * from EMPLOYEE where rownum <5 and FIRSTNAME = 'X';
结果相同,但从技术上讲有什么区别。
PS:同一个人正在接受我的采访,但他似乎不满意。我只能回答说,执行极权是第一位。
答案 0 :(得分:7)
[TL; DR]这两个查询的EXPLAIN PLAN
没有区别;它们的评估结果相同。
测试数据:
CREATE TABLE employee ( firstname ) AS
SELECT CHR( 64 + level ) FROM DUAL CONNECT BY LEVEL <= 26;
说明计划:
EXPLAIN PLAN FOR
select * from EMPLOYEE where FIRSTNAME = 'X' and rownum <5;
SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY());
输出:
| PLAN_TABLE_OUTPUT | | :------------------------------------------------------------------------------ | | Plan hash value: 3463100252 | | | | ------------------------------------------------------------------------------- | | | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | | | ------------------------------------------------------------------------------- | | | 0 | SELECT STATEMENT | | 1 | 4 | 3 (0)| 00:00:01 | | | |* 1 | COUNT STOPKEY | | | | | | | | |* 2 | TABLE ACCESS FULL| EMPLOYEE | 1 | 4 | 3 (0)| 00:00:01 | | | ------------------------------------------------------------------------------- | | | | Predicate Information (identified by operation id): | | --------------------------------------------------- | | | | 1 - filter(ROWNUM<5) | | 2 - filter("FIRSTNAME"='X') | | | | Note | | ----- | | - dynamic sampling used for this statement (level=2) |
和
EXPLAIN PLAN FOR
select * from EMPLOYEE where rownum <5 and FIRSTNAME = 'X';
SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY());
输出:
| PLAN_TABLE_OUTPUT | | :------------------------------------------------------------------------------ | | Plan hash value: 3463100252 | | | | ------------------------------------------------------------------------------- | | | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | | | ------------------------------------------------------------------------------- | | | 0 | SELECT STATEMENT | | 1 | 4 | 3 (0)| 00:00:01 | | | |* 1 | COUNT STOPKEY | | | | | | | | |* 2 | TABLE ACCESS FULL| EMPLOYEE | 1 | 4 | 3 (0)| 00:00:01 | | | ------------------------------------------------------------------------------- | | | | Predicate Information (identified by operation id): | | --------------------------------------------------- | | | | 1 - filter(ROWNUM<5) | | 2 - filter("FIRSTNAME"='X') | | | | Note | | ----- | | - dynamic sampling used for this statement (level=2) |
db <>提琴here
如您所见,Oracle的SQL引擎为两个查询生成相同的计划,并将对它们进行相同的评估;与WHERE
子句中的表达式顺序没有什么不同。