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:同一个人正在接受我的采访,但他似乎不满意。我只能回答,执行极权是第一位。
[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子句中的表达式顺序没有区别。
| 归档时间: |
|
| 查看次数: |
60 次 |
| 最近记录: |