【发布时间】:2020-04-23 11:02:49
【问题描述】:
为什么 oracle 选择 INDEX FULL SCAN 然后选择 ACCESS BY INDEX ROWID 而不是全表扫描,它是一步完成的,而且可能更快?
为什么选择甲骨文
| 2 | TABLE ACCESS BY INDEX ROWID
| 3 | INDEX FULL SCAN
超过
| 2 | TABLE ACCESS FULL|
为了进一步说明,这是查询和完整的执行计划
SELECT EMP_NO, ENAME, SALARY, dname
FROM EMP E, DEPT D
WHERE E.DEPT_NO=D.DEPT_NO;
Execution Plan
----------------------------------------------------------
Plan hash value: 2125045483
----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 879 | 35160 | 8 (13)| 00:00:01 |
| 1 | MERGE JOIN | | 879 | 35160 | 8 (13)| 00:00:01 |
| 2 | TABLE ACCESS BY INDEX ROWID| DEPT | 7 | 91 | 2 (0)| 00:00:01 |
| 3 | INDEX FULL SCAN | DEPT_PK | 7 | | 1 (0)| 00:00:01 |
|* 4 | SORT JOIN | | 879 | 23733 | 6 (17)| 00:00:01 |
| 5 | TABLE ACCESS FULL | EMP | 879 | 23733 | 5 (0)| 00:00:01 |
----------------------------------------------------------------------------------------
【问题讨论】:
-
只有在索引部分符合条件时才会读取表数据。取决于预期的结果集是不是更快
-
你能多展示一点执行计划吗? INDEX FULL SCAN 的一个可能优点是它按顺序读取数据,这样可以避免排序。查询中是否有
ORDER BY? -
我们不知道您正在运行什么查询,正在访问哪些表,或者表中有哪些数据,因此无法回答您的问题。
-
嗨,我已经编辑了问题以澄清,感谢 cmets