首页 > 数据库 > Oracle > explain-join-methods
SQL> explain plan for 2 select * from emp,dept where dept.deptno=emp.deptno; Explained. SQL> select * from table(dbms_xplan.display()); PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------------------------------------------------------------------------ Plan hash value: 844388907 ---------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ---------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 15 | 855 | 6 (17)| 00:00:01 | | 1 | MERGE JOIN | | 15 | 855 | 6 (17)| 00:00:01 | | 2 | TABLE ACCESS BY INDEX ROWID| DEPT | 4 | 80 | 2 (0)| 00:00:01 | | 3 | INDEX FULL SCAN | PK_DEPT | 4 | | 1 (0)| 00:00:01 | |* 4 | SORT JOIN | | 15 | 555 | 4 (25)| 00:00:01 | | 5 | TABLE ACCESS FULL | EMP | 15 | 555 | 3 (0)| 00:00:01 | PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------------------------------------------------------------------------从执行计划看。
首先对单表做排序(sort emp), dept表访问路径为index,不在需要排序,排序完成之后。做 行 的合并。
----理解 NESTED LOOPS
SQL> explain plan for 2 select * from emp,dept where dept.deptno!=emp.deptno; Explained. SQL> select * from table(dbms_xplan.display()); PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------------------------------------------------------------------------ Plan hash value: 4192419542 --------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 45 | 2565 | 11 (0)| 00:00:01 | | 1 | NESTED LOOPS | | 45 | 2565 | 11 (0)| 00:00:01 | | 2 | TABLE ACCESS FULL| DEPT | 4 | 80 | 3 (0)| 00:00:01 | |* 3 | TABLE ACCESS FULL| EMP | 11 | 407 | 2 (0)| 00:00:01 | ---------------------------------------------------------------------------首先dept表为驱动表。取出一条数据,去遍历emp表,然后取出dept的第2条数据,去遍历emp,。。。一直到dept的结果取完
--理解NESTED LOOPS SEMI
SQL> explain plan for
2 select * from emp where exists(select 1 from dept where dept.deptno=emp.deptno);
Explained.
SQL> select * from table(dbms_xplan.display());
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 3274513678
------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 15 | 600 | 3 (0)| 00:00:01 |
| 1 | NESTED LOOPS SEMI | | 15 | 600 | 3 (0)| 00:00:01 |
| 2 | TABLE ACCESS FULL| EMP | 15 | 555 | 3 (0)| 00:00:01 |
|* 3 | INDEX UNIQUE SCAN| PK_DEPT | 4 | 12 | 0 (0)| 00:00:01 |
------------------------------------------------------------------------------
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("DEPT"."DEPTNO"="EMP"."DEPTNO")
----理解 NESTED LOOPS ANTI
SQL> explain plan for 2 select * from emp where not exists(select 1 from dept where dept.deptno=emp.deptno); Explained. SQL> select * from table(dbms_xplan.display()); PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------------------------------------------------------------------------ Plan hash value: 3496123964 ------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | 1 | 40 | 3 (0)| 00:00:01 | | 1 | NESTED LOOPS ANTI | | 1 | 40 | 3 (0)| 00:00:01 | | 2 | TABLE ACCESS FULL| EMP | 15 | 555 | 3 (0)| 00:00:01 | |* 3 | INDEX UNIQUE SCAN| PK_DEPT | 4 | 12 | 0 (0)| 00:00:01 | ------------------------------------------------------------------------------
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30182853/viewspace-1482659/ ,如需转载,请注明出处,否则将追究法律责任。