CBO基礎概念中有講到,訪問表的方式有兩種:全表掃描和ROWID掃描。
全表掃描的執行計劃:TABLE ACCESS FULL
ROWID掃描對應執行計劃:TABLE ACCESS BY USER ROWID 或 TABLE ACCESS BY INDEX ROWID
通過例子說明
select empno,ename from scott.emp
select *from table(dbms_xplan.display_cursor(null,null))
SQL_ID 6c0fp61y99tuw, child number 0
-------------------------------------
select empno,ename from scott.emp
Plan hash value: 3956160932
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 3 (100)| |
| 1 | TABLE ACCESS FULL| EMP | 14 | 140 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
select empno,ename from scott.emp where rowid='AAASZHAAEAAAACXAAA' select *from table(dbms_xplan.display_cursor(null,null)) SQL_ID 99f9cvxt33nzy, child number 0 ------------------------------------- select empno,ename from scott.emp where rowid='AAASZHAAEAAAACXAAA' Plan hash value: 1116584662 ----------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 1 (100)| | | 1 | TABLE ACCESS BY USER ROWID| EMP | 1 | 22 | 1 (0)| 00:00:01 | -----------------------------------------------------------------------------------
select empno,ename from scott.emp where empno=7521 select *from table(dbms_xplan.display_cursor(null,null)) SQL_ID 69nxfycyppq7m, child number 0 ------------------------------------- select empno,ename from scott.emp where empno=7521 Plan hash value: 2949544139 -------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 1 (100)| | | 1 | TABLE ACCESS BY INDEX ROWID| EMP | 1 | 10 | 1 (0)| 00:00:01 | |* 2 | INDEX UNIQUE SCAN | PK_EMP | 1 | | 0 (0)| | -------------------------------------------------------------------------------------- ...
索引唯一掃描、索引范圍掃描、索引全掃描、索引快速掃描、索引跳躍式掃描
以上這些執行計劃執行計劃相對應
例子說明
select empno,ename from scott.emp where empno=7521 select *from table(dbms_xplan.display_cursor(null,null)) SQL_ID 69nxfycyppq7m, child number 0 ------------------------------------- select empno,ename from scott.emp where empno=7521 Plan hash value: 2949544139 -------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 1 (100)| | | 1 | TABLE ACCESS BY INDEX ROWID| EMP | 1 | 10 | 1 (0)| 00:00:01 | |* 2 | INDEX UNIQUE SCAN | PK_EMP | 1 | | 0 (0)| | --------------------------------------------------------------------------------------
通過唯一索引的方式獲取rowid訪問表中的以rowid的方式
select empno,ename from scott.emp where empno>=7521 and empno<=8521
select *from table(dbms_xplan.display_cursor(null,null))
SQL_ID 95m0uw0yxc10w, child number 0
-------------------------------------
select empno,ename from scott.emp where empno>=7521 and empno<=8521
Plan hash value: 169057108
--------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 2 (100)| |
| 1 | TABLE ACCESS BY INDEX ROWID| EMP | 11 | 110 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | PK_EMP | 11 | | 1 (0)| 00:00:01 |
--------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("EMPNO">=7521 AND "EMPNO"<=8521)
謂詞中存在大於、小於的訪問方式時,並且這個謂詞建議過索引,基本采用索引范圍掃描的方式
select empno,ename from scott.emp order by empno select *from table(dbms_xplan.display_cursor(null,null)) SQL_ID 3bt7b5h1rxh6z, child number 0 ------------------------------------- select empno,ename from scott.emp order by empno Plan hash value: 4170700152 -------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 2 (100)| | | 1 | TABLE ACCESS BY INDEX ROWID| EMP | 14 | 140 | 2 (0)| 00:00:01 | | 2 | INDEX FULL SCAN | PK_EMP | 14 | | 1 (0)| 00:00:01 | --------------------------------------------------------------------------------------
當索引列的定義可以為null
create index ind_EMP_JOB ON scott.emp(JOB);
select empno,ename from scott.emp order by job
select *from table(dbms_xplan.display_cursor(null,null))
SQL_ID cnpptzn6mshrb, child number 0
-------------------------------------
select empno,ename from scott.emp order by job
Plan hash value: 150391907
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 4 (100)| |
| 1 | SORT ORDER BY | | 14 | 252 | 4 (25)| 00:00:01 |
| 2 | TABLE ACCESS FULL| EMP | 14 | 252 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
發現如果JOB列定義可以為空的話,order by 是不會走索引的。
調整列的屬性,不能為空,在查看執行計劃
alter table scott.emp modify(job not null)
select empno,ename from scott.emp order by job
select *from table(dbms_xplan.display_cursor(null,null))
SQL_ID cnpptzn6mshrb, child number 0
-------------------------------------
select empno,ename from scott.emp order by job
Plan hash value: 157317628
-------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 2 (100)| |
| 1 | TABLE ACCESS BY INDEX ROWID| EMP | 14 | 252 | 2 (0)| 00:00:01 |
| 2 | INDEX FULL SCAN | IND_EMP_JOB | 14 | | 1 (0)| 00:00:01 |
-------------------------------------------------------------------------------------------
select /*+index_ffs(a ind_EMP_JOB)*/ job from scott.emp a
select *from table(dbms_xplan.display_cursor(null,null))
SQL_ID 3hu16hz75qkhu, child number 0
-------------------------------------
select /*+index_ffs(a ind_EMP_JOB)*/ job from scott.emp a
Plan hash value: 2520590889
------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 2 (100)| |
| 1 | INDEX FAST FULL SCAN| IND_EMP_JOB | 14 | 112 | 2 (0)| 00:00:01 |
------------------------------------------------------------------------------------
這裡使用HINT,強制提示優化器走fast索引的方式
用於復合索引中的,非索引前導列的訪問
create index ind_EMP_JENAME ON scott.emp(JOB,ename);
select empno,ename from scott.emp where ename='ALLEN'
SQL_ID bdfu46xwtg0qk, child number 0
-------------------------------------
select empno,ename from scott.emp where ename='ALLEN'
Plan hash value: 878294805
----------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 2 (100)| |
| 1 | TABLE ACCESS BY INDEX ROWID| EMP | 1 | 10 | 2 (0)| 00:00:01 |
|* 2 | INDEX SKIP SCAN | IND_EMP_JENAME | 1 | | 1 (0)| 00:00:01 |
----------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("ENAME"='ALLEN')
filter("ENAME"='ALLEN')
適用於數據倉庫,不適用OLTP系統,物理存儲結構類似B*數索引,對應rowid的上限、rowid的下限、位圖段。
對於oracle數據庫中的位圖索引而言,他是沒有行鎖這個概念的,要鎖就鎖索引行的整個位圖段,而多個數據行可能對應同一個索引行的位圖段,這個鎖的粒度就決定了位圖索引不適用於高並發並頻繁修改的OLTP系統,在OLTP系統中,很容易產生死鎖。
Create table test_normal (empno number(10), ename varchar2(30), sal number(10)) TABLESPACE GLL01;
Begin
For i in 1..1000000
Loop
Insert into test_normal
values(i, dbms_random.string('U',30), dbms_random.value(1000,7000));
If mod(i, 10000) = 0 then
Commit;
End if;
End loop;
End;
create bitmap index normal_empno_bmx on test_normal(empno) TABLESPACE GLL01;
create bitmap index normal_empno_sal on test_normal(sal) TABLESPACE GLL01;
EXECUTE DBMS_STATS.GATHER_TABLE_STATS('SYS','TEST_NORMAL',CASCADE=>TRUE);
select * from test_normal where empno=1000
select *from table(dbms_xplan.display_cursor(null,null))
SQL_ID 343wc0yvq4cc9, child number 0
-------------------------------------
select * from test_normal where empno=1000
Plan hash value: 4267925254
-------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 3 (100)| |
| 1 | TABLE ACCESS BY INDEX ROWID | TEST_NORMAL | 1 | 40 | 3 (0)| 00:00:01 |
| 2 | BITMAP CONVERSION TO ROWIDS| | | | | |
|* 3 | BITMAP INDEX SINGLE VALUE | NORMAL_EMPNO_BMX | | | | |
-------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("EMPNO"=1000)
select * from test_normal where empno>=50 and empno<=2000
select *from table(dbms_xplan.display_cursor(null,null))
SQL_ID 34p69q6q4wqxx, child number 0
-------------------------------------
select * from test_normal where empno>=50 and empno<=2000
Plan hash value: 641040856
-------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 362 (100)| |
| 1 | TABLE ACCESS BY INDEX ROWID | TEST_NORMAL | 1952 | 78080 | 362 (0)| 00:00:05 |
| 2 | BITMAP CONVERSION TO ROWIDS| | | | | |
|* 3 | BITMAP INDEX RANGE SCAN | NORMAL_EMPNO_BMX | | | | |
-------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("EMPNO">=50 AND "EMPNO"<=2000)
select /*+index(a normal_empno_bmx)*/ a.empno from test_normal a select *from table(dbms_xplan.display_cursor(null,null)) SQL_ID cmxdf5ry1gvw1, child number 0 ------------------------------------- select /*+index(a normal_empno_bmx)*/ a.empno from test_normal a Plan hash value: 220257735 ------------------------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | | | 3496 (100)| | | 1 | BITMAP CONVERSION TO ROWIDS| | 1000K| 4882K| 3496 (1)| 00:00:42 | | 2 | BITMAP INDEX FULL SCAN | NORMAL_EMPNO_BMX | | | | | ------------------------------------------------------------------------------------------------
select /*+index_ffs(a normal_empno_bmx)*/ a.empno from test_normal a select *from table(dbms_xplan.display_cursor(null,null)) SQL_ID 9rgzkasky186v, child number 0 ------------------------------------- select /*+index_ffs(a normal_empno_bmx)*/ a.empno from test_normal a Plan hash value: 2075344169 ------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 3141 (100)| | | 1 | BITMAP CONVERSION TO ROWIDS | | 1000K| 4882K| 3141 (1)| 00:00:38 | | 2 | BITMAP INDEX FAST FULL SCAN| NORMAL_EMPNO_BMX | | | | | -------------------------------------------------------------------------------------------------
select * from test_normal where empno=3969 and sal in (1008,1011)
select *from table(dbms_xplan.display_cursor(null,null))
SQL_ID cyf5th2ts2z7j, child number 0
-------------------------------------
select * from test_normal where empno=3969 and sal in (1008,1011)
Plan hash value: 640003492
--------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 5 (100)| |
| 1 | TABLE ACCESS BY INDEX ROWID | TEST_NORMAL | 1 | 40 | 5 (0)| 00:00:01 |
| 2 | BITMAP CONVERSION TO ROWIDS | | | | | |
| 3 | BITMAP AND | | | | | |
| 4 | BITMAP OR | | | | | |
|* 5 | BITMAP INDEX SINGLE VALUE| NORMAL_EMPNO_SAL | | | | |
|* 6 | BITMAP INDEX SINGLE VALUE| NORMAL_EMPNO_SAL | | | | |
|* 7 | BITMAP INDEX SINGLE VALUE | NORMAL_EMPNO_BMX | | | | |
--------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
5 - access("SAL"=1008)
6 - access("SAL"=1011)
7 - access("EMPNO"=3969)
select /*+index_ffs(test_normal normal_empno_sal)*/ * from test_normal where empno>=50 and empno<=20000 and sal not in (1008)
select *from table(dbms_xplan.display_cursor(null,null))
SQL_ID dn3yq5vrp1524, child number 0
-------------------------------------
select /*+index_ffs(test_normal normal_empno_sal)*/ * from
test_normal where empno>=50 and empno<=20000 and sal not in (1008)
Plan hash value: 3977516083
--------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 1385 (100)| |
| 1 | TABLE ACCESS BY INDEX ROWID | TEST_NORMAL | 19949 | 779K| 1385 (1)| 00:00:17 |
| 2 | BITMAP CONVERSION TO ROWIDS | | | | | |
| 3 | BITMAP MINUS | | | | | |
| 4 | BITMAP MINUS | | | | | |
| 5 | BITMAP MERGE | | | | | |
|* 6 | BITMAP INDEX RANGE SCAN | NORMAL_EMPNO_BMX | | | | |
|* 7 | BITMAP INDEX SINGLE VALUE| NORMAL_EMPNO_SAL | | | | |
|* 8 | BITMAP INDEX SINGLE VALUE | NORMAL_EMPNO_SAL | | | | |
--------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
6 - access("EMPNO">=50 AND "EMPNO"<=20000)
7 - access("SAL"=1008)
8 - access("SAL" IS NULL)
列值為NULL,位圖索引是記錄,以上這個例子中也把列為NULL剔除
select /*+leading(a) use_nl(b)*/* from scott.emp a , scott.dept b where a.deptno=b.deptno
select *from table(dbms_xplan.display_cursor(null,null))
SQL_ID c6xax626nhn8k, child number 0
-------------------------------------
select /*+leading(a) use_nl(b)*/* from scott.emp a , scott.dept b
where a.deptno=b.deptno
Plan hash value: 3625962092
----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 17 (100)| |
| 1 | NESTED LOOPS | | | | | |
| 2 | NESTED LOOPS | | 14 | 798 | 17 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL | EMP | 14 | 532 | 3 (0)| 00:00:01 |
|* 4 | INDEX UNIQUE SCAN | PK_DEPT | 1 | | 0 (0)| |
| 5 | TABLE ACCESS BY INDEX ROWID| DEPT | 1 | 19 | 1 (0)| 00:00:01 |
----------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
4 - access("A"."DEPTNO"="B"."DEPTNO")
select /*+leading(a) use_hash(b)*/* from scott.emp a , scott.dept b where a.deptno=b.deptno
select *from table(dbms_xplan.display_cursor(null,null))
SQL_ID fq65sryy1d9dw, child number 0
-------------------------------------
select /*+leading(a) use_hash(b)*/* from scott.emp a , scott.dept b
where a.deptno=b.deptno
Plan hash value: 1123238657
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 7 (100)| |
|* 1 | HASH JOIN | | 14 | 798 | 7 (15)| 00:00:01 |
| 2 | TABLE ACCESS FULL| EMP | 14 | 532 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| DEPT | 3 | 57 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("A"."DEPTNO"="B"."DEPTNO")
select /*+use_merge(a b)*/* from scott.emp a , scott.dept b where a.deptno=b.deptno
select *from table(dbms_xplan.display_cursor(null,null))
SQL_ID 9w06suya2pdrn, child number 0
-------------------------------------
select /*+use_merge(a b)*/* from scott.emp a , scott.dept b where
a.deptno=b.deptno
Plan hash value: 844388907
----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 6 (100)| |
| 1 | MERGE JOIN | | 14 | 798 | 6 (17)| 00:00:01 |
| 2 | TABLE ACCESS BY INDEX ROWID| DEPT | 3 | 57 | 2 (0)| 00:00:01 |
| 3 | INDEX FULL SCAN | PK_DEPT | 3 | | 1 (0)| 00:00:01 |
|* 4 | SORT JOIN | | 14 | 532 | 4 (25)| 00:00:01 |
| 5 | TABLE ACCESS FULL | EMP | 14 | 532 | 3 (0)| 00:00:01 |
----------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
4 - access("A"."DEPTNO"="B"."DEPTNO")
filter("A"."DEPTNO"="B"."DEPTNO")
alter table scott.emp modify(deptno not null)
select * from scott.emp a WHERE A.DEPTNO NOT IN (SELECT /*+nl_aj*/ DEPTNO FROM scott.dept b where a.deptno=b.deptno)
select *from table(dbms_xplan.display_cursor(null,null))
SQL_ID dh1c9mwpw9pjx, child number 0
-------------------------------------
select * from scott.emp a WHERE A.DEPTNO NOT IN (SELECT /*+nl_aj*/
DEPTNO FROM scott.dept b where a.deptno=b.deptno)
Plan hash value: 3496123964
------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 3 (100)| |
| 1 | NESTED LOOPS ANTI | | 7 | 287 | 3 (0)| 00:00:01 |
| 2 | TABLE ACCESS FULL| EMP | 14 | 532 | 3 (0)| 00:00:01 |
|* 3 | INDEX UNIQUE SCAN| PK_DEPT | 2 | 6 | 0 (0)| |
------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("A"."DEPTNO"="B"."DEPTNO")
select * from scott.emp a WHERE A.DEPTNO NOT IN (SELECT /*+hash_aj*/ DEPTNO FROM scott.dept b where a.deptno=b.deptno)
select *from table(dbms_xplan.display_cursor(null,null))
SQL_ID dhq4hhqgqqn0n, child number 0
-------------------------------------
select * from scott.emp a WHERE A.DEPTNO NOT IN (SELECT /*+hash_aj*/
DEPTNO FROM scott.dept b where a.deptno=b.deptno)
Plan hash value: 1958379418
------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 5 (100)| |
|* 1 | HASH JOIN ANTI | | 7 | 287 | 5 (20)| 00:00:01 |
| 2 | TABLE ACCESS FULL| EMP | 14 | 532 | 3 (0)| 00:00:01 |
| 3 | INDEX FULL SCAN | PK_DEPT | 3 | 9 | 1 (0)| 00:00:01 |
------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("A"."DEPTNO"="B"."DEPTNO")
select * from scott.emp a WHERE A.DEPTNO NOT IN (SELECT /*+merge_aj*/ DEPTNO FROM scott.dept b where a.deptno=b.deptno)
select *from table(dbms_xplan.display_cursor(null,null))
SQL_ID 1r60ktudp9vq2, child number 0
-------------------------------------
select * from scott.emp a WHERE A.DEPTNO NOT IN (SELECT
/*+merge_aj*/ DEPTNO FROM scott.dept b where a.deptno=b.deptno)
Plan hash value: 4267419248
-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 6 (100)| |
| 1 | MERGE JOIN ANTI | | 7 | 287 | 6 (34)| 00:00:01 |
| 2 | SORT JOIN | | 14 | 532 | 4 (25)| 00:00:01 |
| 3 | TABLE ACCESS FULL| EMP | 14 | 532 | 3 (0)| 00:00:01 |
|* 4 | SORT UNIQUE | | 3 | 9 | 2 (50)| 00:00:01 |
| 5 | INDEX FULL SCAN | PK_DEPT | 3 | 9 | 1 (0)| 00:00:01 |
-------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
4 - access("A"."DEPTNO"="B"."DEPTNO")
filter("A"."DEPTNO"="B"."DEPTNO")
select * from scott.emp a WHERE EXISTS (SELECT /*+nl_sj*/ 1 FROM scott.dept b where a.deptno=b.deptno)
select *from table(dbms_xplan.display_cursor(null,null))
SQL_ID 9htytj0pxjhkg, child number 0
-------------------------------------
select * from scott.emp a WHERE EXISTS (SELECT /*+nl_sj*/ 1 FROM
scott.dept b where a.deptno=b.deptno)
Plan hash value: 3274513678
------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 3 (100)| |
| 1 | NESTED LOOPS SEMI | | 7 | 287 | 3 (0)| 00:00:01 |
| 2 | TABLE ACCESS FULL| EMP | 14 | 532 | 3 (0)| 00:00:01 |
|* 3 | INDEX UNIQUE SCAN| PK_DEPT | 2 | 6 | 0 (0)| |
------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("A"."DEPTNO"="B"."DEPTNO")
select * from scott.emp a WHERE EXISTS (SELECT /*+hash_sj*/ 1 FROM scott.dept b where a.deptno=b.deptno)
select *from table(dbms_xplan.display_cursor(null,null))
SQL_ID cjhjgkgs8q1fc, child number 0
-------------------------------------
select * from scott.emp a WHERE EXISTS (SELECT /*+hash_sj*/ 1 FROM
scott.dept b where a.deptno=b.deptno)
Plan hash value: 3753861400
------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 5 (100)| |
|* 1 | HASH JOIN SEMI | | 7 | 287 | 5 (20)| 00:00:01 |
| 2 | TABLE ACCESS FULL| EMP | 14 | 532 | 3 (0)| 00:00:01 |
| 3 | INDEX FULL SCAN | PK_DEPT | 3 | 9 | 1 (0)| 00:00:01 |
------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("A"."DEPTNO"="B"."DEPTNO")
select * from scott.emp a WHERE EXISTS (SELECT /*+merge_sj*/ 1 FROM scott.dept b where a.deptno=b.deptno)
select *from table(dbms_xplan.display_cursor(null,null))
SQL_ID f2zxcjpqvpsu5, child number 0
-------------------------------------
select * from scott.emp a WHERE EXISTS (SELECT /*+merge_sj*/ 1 FROM
scott.dept b where a.deptno=b.deptno)
Plan hash value: 3011744318
-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 6 (100)| |
| 1 | MERGE JOIN SEMI | | 7 | 287 | 6 (34)| 00:00:01 |
| 2 | SORT JOIN | | 14 | 532 | 4 (25)| 00:00:01 |
| 3 | TABLE ACCESS FULL| EMP | 14 | 532 | 3 (0)| 00:00:01 |
|* 4 | SORT UNIQUE | | 3 | 9 | 2 (50)| 00:00:01 |
| 5 | INDEX FULL SCAN | PK_DEPT | 3 | 9 | 1 (0)| 00:00:01 |
-------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
4 - access("A"."DEPTNO"="B"."DEPTNO")
filter("A"."DEPTNO"="B"."DEPTNO")