SQL:“哪里FIRSTNAME ='X'和rownum <5”与“哪里rownum <5和FIRSTNAME ='X'”之间有什么区别?

时间:2019-10-18 09:09:09

标签: sql oracle rownum

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:同一个人正在接受我的采访,但他似乎不满意。我只能回答说,执行极权是第一位。

1 个答案:

答案 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子句中的表达式顺序没有什么不同。