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

fat*_*ael 0 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';
Run Code Online (Sandbox Code Playgroud)

结果是相同的,但在技术上有什么不同。

PS:同一个人正在接受我的采访,但他似乎不满意。我只能回答,执行极权是第一位。

MT0*_*MT0 7

[TL; DR] EXPLAIN PLAN两种查询的并无区别;它们的评估结果相同。


测试数据

CREATE TABLE employee ( firstname ) AS
SELECT CHR( 64 + level ) FROM DUAL CONNECT BY LEVEL <= 26;
Run Code Online (Sandbox Code Playgroud)

说明计划

EXPLAIN PLAN FOR
select * from EMPLOYEE where FIRSTNAME = 'X' and rownum <5;

SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY());
Run Code Online (Sandbox Code Playgroud)

输出:

| PLAN_TABLE_OUTPUT |
| :------------------------------------------------- ----------------------------- |
| 计划哈希值:3463100252 |
| |
| -------------------------------------------------- ----------------------------- |
| | ID | 操作| 姓名| 行| 字节数| 费用(%CPU)| 时间| |
| -------------------------------------------------- ----------------------------- |
| | 0 | 选择声明 | 1 | 4 | 3(0)| 00:00:01 | |
| | * 1 | COUNT STOPKEY | | | | | | |
| | * 2 | 表访问已满| 员工| 1 | 4 | 3(0)| 00:00:01 | |
| -------------------------------------------------- ----------------------------- |
| |
| 谓词信息(由操作ID标识):
| -------------------------------------------------- -|
| |
| 1-过滤器(ROWNUM <5)|
| 2-filter(“ FIRSTNAME” ='X')|
| |
| 注意事项
| ----- |
| -用于此语句的动态采样(级别= 2)|

| 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)                         |

输出:

| PLAN_TABLE_OUTPUT |
| :------------------------------------------------- ----------------------------- |
| 计划哈希值:3463100252 |
| |
| -------------------------------------------------- ----------------------------- |
| | ID | 操作| 姓名| 行| 字节数| 费用(%CPU)| 时间| |
| -------------------------------------------------- ----------------------------- |
| | 0 | 选择声明 | 1 | 4 | 3(0)| 00:00:01 | |
| | * 1 | COUNT STOPKEY | | | | | | |
| | * 2 | 表访问已满| 员工| 1 | 4 | 3(0)| 00:00:01 | |
| -------------------------------------------------- ----------------------------- |
| |
| 谓词信息(由操作ID标识):
| -------------------------------------------------- -|
| |
| 1-过滤器(ROWNUM <5)|
| 2-filter(“ FIRSTNAME” ='X')|
| |
| 注意事项
| ----- |
| -用于此语句的动态采样(级别= 2)|

db <> 在这里拨弄

如您所见,Oracle的SQL引擎为两个查询生成相同的计划,并将对它们进行相同的评估。与WHERE子句中的表达式顺序没有区别。