在SQL语句中,不管有多么复杂都是两个表之间的连接,复杂语句只是这个过程更加复杂。只有对于基本多表连接熟悉掌握,才可以对复杂语句进行抽丝剥茧的逐层破译。
[结果说明]
1.被驱动表的连接字段必须要有索引;
2.被驱动表如果有其他字段,可考虑是否将连接字段与其他字段一起创建复合索引;
3.驱动表通过索引字段优化避免全表扫描;
[测试数据]
测试环境构筑
create table a (c1 varchar2(30),c2 varchar2(30),c3 varchar2(30));
insert into a (c1,c2,c3) values ('A_C1_01','','C3_01');
insert into a (c1,c2,c3) values ('A_C1_02','','C3_02');
insert into a (c1,c2,c3) values ('A_C1_03','','C3_03');
insert into a (c1,c2,c3) values ('A_C1_04','','C3_04');
insert into a (c1,c2,c3) values ('A_C1_05','','C3_05');
commit;
create table b (c1 varchar2(30),c2 varchar2(30),c3 varchar2(30));
insert into b (c1,c2,c3) values ('','B_C2_01','C3_01');
insert into b (c1,c2,c3) values ('','B_C2_02','C3_02');
insert into b (c1,c2,c3) values ('','B_C2_03','C3_03');
insert into b (c1,c2,c3) values ('','B_C2_04','C3_04');
insert into b (c1,c2,c3) values ('','B_C2_05','C3_05');
commit;
在执行计划如果显示是access,就表示这个谓词条件的值将会影响数据的访问路径(表还是索引),而filter表示谓词条件的值并不会影响数据访问路径,只起到过滤的作用。
内连接测试
-- 无索引状态
SQL> select a.c1,b.c2 from a join b on a.c3=b.c3;
C1 C2
------------------------------------------------------------ ------------------------------------------------------------
A_C1_01 B_C2_01
A_C1_02 B_C2_02
A_C1_03 B_C2_03
A_C1_04 B_C2_04
A_C1_05 B_C2_05
执行计划
----------------------------------------------------------
Plan hash value: 652036164
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 5 | 340 | 6 (0)| 00:00:01 |
|* 1 | HASH JOIN | | 5 | 340 | 6 (0)| 00:00:01 |
| 2 | TABLE ACCESS FULL| A | 5 | 170 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| B | 5 | 170 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("A"."C3"="B"."C3")
Note
-----
- dynamic sampling used for this statement (level=2)
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
15 consistent gets
0 physical reads
0 redo size
735 bytes sent via SQL*Net to client
523 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
5 rows processed
-- A表 C3 字段有索引,B表 无索引
SQL> select a.c1,b.c2 from a join b on a.c3=b.c3;
C1 C2
------------------------------------------------------------ ------------------------------------------------------------
A_C1_01 B_C2_01
A_C1_02 B_C2_02
A_C1_03 B_C2_03
A_C1_04 B_C2_04
A_C1_05 B_C2_05
执行计划
----------------------------------------------------------
Plan hash value: 2937931297
-----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 5 | 340 | 6 (17)| 00:00:01 |
| 1 | MERGE JOIN | | 5 | 340 | 6 (17)| 00:00:01 |
| 2 | TABLE ACCESS BY INDEX ROWID| A | 5 | 170 | 2 (0)| 00:00:01 |
| 3 | INDEX FULL SCAN | IDX_A_C3 | 5 | | 1 (0)| 00:00:01 |
|* 4 | SORT JOIN | | 5 | 170 | 4 (25)| 00:00:01 |
| 5 | TABLE ACCESS FULL | B | 5 | 170 | 3 (0)| 00:00:01 |
-----------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
4 - access("A"."C3"="B"."C3")
filter("A"."C3"="B"."C3")
Note
-----
- dynamic sampling used for this statement (level=2)
统计信息
----------------------------------------------------------
8 recursive calls
0 db block gets
28 consistent gets
0 physical reads
0 redo size
735 bytes sent via SQL*Net to client
523 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
5 rows processed
-- A表无索引,B表 C3字段有索引
SQL> select a.c1,b.c2 from a join b on a.c3=b.c3;
C1 C2
------------------------------------------------------------ ------------------------------------------------------------
A_C1_01 B_C2_01
A_C1_02 B_C2_02
A_C1_03 B_C2_03
A_C1_04 B_C2_04
A_C1_05 B_C2_05
执行计划
----------------------------------------------------------
Plan hash value: 1564157014
-----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 5 | 340 | 6 (17)| 00:00:01 |
| 1 | MERGE JOIN | | 5 | 340 | 6 (17)| 00:00:01 |
| 2 | TABLE ACCESS BY INDEX ROWID| B | 5 | 170 | 2 (0)| 00:00:01 |
| 3 | INDEX FULL SCAN | IDX_B_C3 | 5 | | 1 (0)| 00:00:01 |
|* 4 | SORT JOIN | | 5 | 170 | 4 (25)| 00:00:01 |
| 5 | TABLE ACCESS FULL | A | 5 | 170 | 3 (0)| 00:00:01 |
-----------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
4 - access("A"."C3"="B"."C3")
filter("A"."C3"="B"."C3")
Note
-----
- dynamic sampling used for this statement (level=2)
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
11 consistent gets
0 physical reads
0 redo size
735 bytes sent via SQL*Net to client
523 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
5 rows processed
-- A表与B表均有索引
SQL> select a.c1,b.c2 from a join b on a.c3=b.c3;
C1 C2
------------------------------------------------------------ ------------------------------------------------------------
A_C1_01 B_C2_01
A_C1_02 B_C2_02
A_C1_03 B_C2_03
A_C1_04 B_C2_04
A_C1_05 B_C2_05
执行计划
----------------------------------------------------------
Plan hash value: 2937931297
-----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 5 | 340 | 6 (17)| 00:00:01 |
| 1 | MERGE JOIN | | 5 | 340 | 6 (17)| 00:00:01 |
| 2 | TABLE ACCESS BY INDEX ROWID| A | 5 | 170 | 2 (0)| 00:00:01 |
| 3 | INDEX FULL SCAN | IDX_A_C3 | 5 | | 1 (0)| 00:00:01 |
|* 4 | SORT JOIN | | 5 | 170 | 4 (25)| 00:00:01 |
| 5 | TABLE ACCESS FULL | B | 5 | 170 | 3 (0)| 00:00:01 |
-----------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
4 - access("A"."C3"="B"."C3")
filter("A"."C3"="B"."C3")
Note
-----
- dynamic sampling used for this statement (level=2)
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
11 consistent gets
0 physical reads
0 redo size
735 bytes sent via SQL*Net to client
523 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
5 rows processed
左外连接&右外连接
-- 无索引状态
SQL> select a.c1,b.c2 from a left join b on a.c3=b.c3;
C1 C2
------------------------------------------------------------ ------------------------------------------------------------
A_C1_01 B_C2_01
A_C1_02 B_C2_02
A_C1_03 B_C2_03
A_C1_04 B_C2_04
A_C1_05 B_C2_05
执行计划
----------------------------------------------------------
Plan hash value: 1365417139
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 5 | 340 | 6 (0)| 00:00:01 |
|* 1 | HASH JOIN OUTER | | 5 | 340 | 6 (0)| 00:00:01 |
| 2 | TABLE ACCESS FULL| A | 5 | 170 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| B | 5 | 170 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("A"."C3"="B"."C3"(+))
Note
-----
- dynamic sampling used for this statement (level=2)
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
15 consistent gets
0 physical reads
0 redo size
735 bytes sent via SQL*Net to client
523 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
5 rows processed
-- A表 C3 字段有索引,B表无索引
SQL> select a.c1,b.c2 from a left join b on a.c3=b.c3;
C1 C2
------------------------------------------------------------ ------------------------------------------------------------
A_C1_01 B_C2_01
A_C1_02 B_C2_02
A_C1_03 B_C2_03
A_C1_04 B_C2_04
A_C1_05 B_C2_05
执行计划
----------------------------------------------------------
Plan hash value: 1365417139
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 5 | 340 | 6 (0)| 00:00:01 |
|* 1 | HASH JOIN OUTER | | 5 | 340 | 6 (0)| 00:00:01 |
| 2 | TABLE ACCESS FULL| A | 5 | 170 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| B | 5 | 170 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("A"."C3"="B"."C3"(+))
Note
-----
- dynamic sampling used for this statement (level=2)
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
15 consistent gets
0 physical reads
0 redo size
735 bytes sent via SQL*Net to client
523 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
5 rows processed
-- B表 C3 字段有索引,A表无索引
SQL> select a.c1,b.c2 from a left join b on a.c3=b.c3;
C1 C2
------------------------------------------------------------ ------------------------------------------------------------
A_C1_01 B_C2_01
A_C1_02 B_C2_02
A_C1_03 B_C2_03
A_C1_04 B_C2_04
A_C1_05 B_C2_05
执行计划
----------------------------------------------------------
Plan hash value: 1365417139
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 5 | 340 | 6 (0)| 00:00:01 |
|* 1 | HASH JOIN OUTER | | 5 | 340 | 6 (0)| 00:00:01 |
| 2 | TABLE ACCESS FULL| A | 5 | 170 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| B | 5 | 170 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("A"."C3"="B"."C3"(+))
Note
-----
- dynamic sampling used for this statement (level=2)
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
15 consistent gets
0 physical reads
0 redo size
735 bytes sent via SQL*Net to client
523 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
5 rows processed
-- A表与B表均有索引
SQL> select a.c1,b.c2 from a left join b on a.c3=b.c3;
C1 C2
------------------------------------------------------------ ------------------------------------------------------------
A_C1_01 B_C2_01
A_C1_02 B_C2_02
A_C1_03 B_C2_03
A_C1_04 B_C2_04
A_C1_05 B_C2_05
执行计划
----------------------------------------------------------
Plan hash value: 1365417139
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 5 | 340 | 6 (0)| 00:00:01 |
|* 1 | HASH JOIN OUTER | | 5 | 340 | 6 (0)| 00:00:01 |
| 2 | TABLE ACCESS FULL| A | 5 | 170 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| B | 5 | 170 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("A"."C3"="B"."C3"(+))
Note
-----
- dynamic sampling used for this statement (level=2)
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
15 consistent gets
0 physical reads
0 redo size
735 bytes sent via SQL*Net to client
523 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
5 rows processed
-- 无索引状态
SQL> select a.c1,b.c2 from a right join b on a.c3=b.c3;
C1 C2
------------------------------------------------------------ ------------------------------------------------------------
A_C1_01 B_C2_01
A_C1_02 B_C2_02
A_C1_03 B_C2_03
A_C1_04 B_C2_04
A_C1_05 B_C2_05
执行计划
----------------------------------------------------------
Plan hash value: 843196925
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 5 | 340 | 6 (0)| 00:00:01 |
|* 1 | HASH JOIN OUTER | | 5 | 340 | 6 (0)| 00:00:01 |
| 2 | TABLE ACCESS FULL| B | 5 | 170 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| A | 5 | 170 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("A"."C3"(+)="B"."C3")
Note
-----
- dynamic sampling used for this statement (level=2)
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
15 consistent gets
0 physical reads
0 redo size
735 bytes sent via SQL*Net to client
523 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
5 rows processed
-- A表 C3 字段有索引,B表无索引
SQL> select a.c1,b.c2 from a right join b on a.c3=b.c3;
C1 C2
------------------------------------------------------------ ------------------------------------------------------------
A_C1_01 B_C2_01
A_C1_02 B_C2_02
A_C1_03 B_C2_03
A_C1_04 B_C2_04
A_C1_05 B_C2_05
执行计划
----------------------------------------------------------
Plan hash value: 843196925
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 5 | 340 | 6 (0)| 00:00:01 |
|* 1 | HASH JOIN OUTER | | 5 | 340 | 6 (0)| 00:00:01 |
| 2 | TABLE ACCESS FULL| B | 5 | 170 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| A | 5 | 170 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("A"."C3"(+)="B"."C3")
Note
-----
- dynamic sampling used for this statement (level=2)
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
15 consistent gets
0 physical reads
0 redo size
735 bytes sent via SQL*Net to client
523 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
5 rows processed
-- B表 C3 字段有索引,A表无索引
SQL> select a.c1,b.c2 from a right join b on a.c3=b.c3;
C1 C2
------------------------------------------------------------ ------------------------------------------------------------
A_C1_01 B_C2_01
A_C1_02 B_C2_02
A_C1_03 B_C2_03
A_C1_04 B_C2_04
A_C1_05 B_C2_05
执行计划
----------------------------------------------------------
Plan hash value: 843196925
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 5 | 340 | 6 (0)| 00:00:01 |
|* 1 | HASH JOIN OUTER | | 5 | 340 | 6 (0)| 00:00:01 |
| 2 | TABLE ACCESS FULL| B | 5 | 170 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| A | 5 | 170 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("A"."C3"(+)="B"."C3")
Note
-----
- dynamic sampling used for this statement (level=2)
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
15 consistent gets
0 physical reads
0 redo size
735 bytes sent via SQL*Net to client
523 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
5 rows processed
-- A表与B表均有索引
SQL> select a.c1,b.c2 from a right join b on a.c3=b.c3;
C1 C2
------------------------------------------------------------ ------------------------------------------------------------
A_C1_01 B_C2_01
A_C1_02 B_C2_02
A_C1_03 B_C2_03
A_C1_04 B_C2_04
A_C1_05 B_C2_05
执行计划
----------------------------------------------------------
Plan hash value: 843196925
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 5 | 340 | 6 (0)| 00:00:01 |
|* 1 | HASH JOIN OUTER | | 5 | 340 | 6 (0)| 00:00:01 |
| 2 | TABLE ACCESS FULL| B | 5 | 170 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| A | 5 | 170 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("A"."C3"(+)="B"."C3")
Note
-----
- dynamic sampling used for this statement (level=2)
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
15 consistent gets
0 physical reads
0 redo size
735 bytes sent via SQL*Net to client
523 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
5 rows processed
全外连接
-- 无索引状态
SQL> select a.c1,b.c2 from a full join b on a.c3=b.c3;
C1 C2
------------------------------------------------------------ ------------------------------------------------------------
A_C1_01 B_C2_01
A_C1_02 B_C2_02
A_C1_03 B_C2_03
A_C1_04 B_C2_04
A_C1_05 B_C2_05
执行计划
----------------------------------------------------------
Plan hash value: 3456740935
----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 5 | 170 | 6 (0)| 00:00:01 |
| 1 | VIEW | VW_FOJ_0 | 5 | 170 | 6 (0)| 00:00:01 |
|* 2 | HASH JOIN FULL OUTER| | 5 | 340 | 6 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL | A | 5 | 170 | 3 (0)| 00:00:01 |
| 4 | TABLE ACCESS FULL | B | 5 | 170 | 3 (0)| 00:00:01 |
----------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("A"."C3"="B"."C3")
Note
-----
- dynamic sampling used for this statement (level=2)
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
15 consistent gets
0 physical reads
0 redo size
735 bytes sent via SQL*Net to client
523 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
5 rows processed
-- 有索引状态
SQL> select a.c1,b.c2 from a full join b on a.c3=b.c3;
C1 C2
------------------------------------------------------------ ------------------------------------------------------------
A_C1_01 B_C2_01
A_C1_02 B_C2_02
A_C1_03 B_C2_03
A_C1_04 B_C2_04
A_C1_05 B_C2_05
执行计划
----------------------------------------------------------
Plan hash value: 3456740935
----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 5 | 170 | 6 (0)| 00:00:01 |
| 1 | VIEW | VW_FOJ_0 | 5 | 170 | 6 (0)| 00:00:01 |
|* 2 | HASH JOIN FULL OUTER| | 5 | 340 | 6 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL | A | 5 | 170 | 3 (0)| 00:00:01 |
| 4 | TABLE ACCESS FULL | B | 5 | 170 | 3 (0)| 00:00:01 |
----------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("A"."C3"="B"."C3")
Note
-----
- dynamic sampling used for this statement (level=2)
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
15 consistent gets
0 physical reads
0 redo size
735 bytes sent via SQL*Net to client
523 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
5 rows processed
theta连接
-- 有索引状态
SQL> select a.c1,b.c2 from a join b on a.c3 != b.c3;
C1 C2
------------------------------------------------------------ ------------------------------------------------------------
A_C1_01 B_C2_02
A_C1_01 B_C2_03
A_C1_01 B_C2_04
A_C1_01 B_C2_05
A_C1_02 B_C2_01
A_C1_02 B_C2_03
A_C1_02 B_C2_04
A_C1_02 B_C2_05
A_C1_03 B_C2_01
A_C1_03 B_C2_02
A_C1_03 B_C2_04
C1 C2
------------------------------------------------------------ ------------------------------------------------------------
A_C1_03 B_C2_05
A_C1_04 B_C2_01
A_C1_04 B_C2_02
A_C1_04 B_C2_03
A_C1_04 B_C2_05
A_C1_05 B_C2_01
A_C1_05 B_C2_02
A_C1_05 B_C2_03
A_C1_05 B_C2_04
已选择20行。
执行计划
----------------------------------------------------------
Plan hash value: 4030965610
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 20 | 1360 | 12 (0)| 00:00:01 |
| 1 | NESTED LOOPS | | 20 | 1360 | 12 (0)| 00:00:01 |
| 2 | TABLE ACCESS FULL| A | 5 | 170 | 3 (0)| 00:00:01 |
|* 3 | TABLE ACCESS FULL| B | 4 | 136 | 2 (0)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - filter("A"."C3"<>"B"."C3")
Note
-----
- dynamic sampling used for this statement (level=2)
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
45 consistent gets
0 physical reads
0 redo size
1121 bytes sent via SQL*Net to client
534 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
20 rows processed
最佳优化
优化方式:
create index idx_a_c1 on a(c1);
create index idx_b_c3 on b(c3);
-- 内连接优化
SQL> select a.c1,b.c2 from a join b on a.c3=b.c3 where a.c1='A_C1_03';
C1 C2
------------------------------------------------------------ ------------------------------------------------------------
A_C1_03 B_C2_03
执行计划
----------------------------------------------------------
Plan hash value: 21225956
-----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 68 | 4 (0)| 00:00:01 |
| 1 | NESTED LOOPS | | 1 | 68 | 4 (0)| 00:00:01 |
| 2 | NESTED LOOPS | | 1 | 68 | 4 (0)| 00:00:01 |
|* 3 | TABLE ACCESS FULL | A | 1 | 34 | 3 (0)| 00:00:01 |
|* 4 | INDEX RANGE SCAN | IDX_B_C3 | 1 | | 0 (0)| 00:00:01 |
| 5 | TABLE ACCESS BY INDEX ROWID| B | 1 | 34 | 1 (0)| 00:00:01 |
-----------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - filter("A"."C1"='A_C1_03')
4 - access("A"."C3"="B"."C3")
Note
-----
- dynamic sampling used for this statement (level=2)
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
11 consistent gets
0 physical reads
0 redo size
605 bytes sent via SQL*Net to client
523 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
-- 左外连接优化
SQL> select a.c1,b.c2 from a left join b on a.c3=b.c3 where a.c1='A_C1_03';
C1 C2
------------------------------------------------------------ -----------------------------------------------------------
A_C1_03 B_C2_03
执行计划
----------------------------------------------------------
Plan hash value: 426852710
-----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 68 | 3 (0)| 00:00:01 |
| 1 | NESTED LOOPS OUTER | | 1 | 68 | 3 (0)| 00:00:01 |
| 2 | TABLE ACCESS BY INDEX ROWID| A | 1 | 34 | 2 (0)| 00:00:01 |
|* 3 | INDEX RANGE SCAN | IDX_A_C1 | 1 | | 1 (0)| 00:00:01 |
| 4 | TABLE ACCESS BY INDEX ROWID| B | 1 | 34 | 1 (0)| 00:00:01 |
|* 5 | INDEX RANGE SCAN | IDX_B_C3 | 1 | | 0 (0)| 00:00:01 |
-----------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("A"."C1"='A_C1_03')
5 - access("A"."C3"="B"."C3"(+))
Note
-----
- dynamic sampling used for this statement (level=2)
统计信息
----------------------------------------------------------
12 recursive calls
0 db block gets
26 consistent gets
0 physical reads
0 redo size
605 bytes sent via SQL*Net to client
523 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
-- 右外连接优化
SQL> select a.c1,b.c2 from a right join b on a.c3=b.c3 where a.c1='A_C1_03';
C1 C2
------------------------------------------------------------ -----------------------------------------------------------
A_C1_03 B_C2_03
执行计划
----------------------------------------------------------
Plan hash value: 3356106362
------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 68 | 3 (0)| 00:00:01 |
| 1 | NESTED LOOPS | | 1 | 68 | 3 (0)| 00:00:01 |
| 2 | NESTED LOOPS | | 1 | 68 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS BY INDEX ROWID| A | 1 | 34 | 2 (0)| 00:00:01 |
|* 4 | INDEX RANGE SCAN | IDX_A_C1 | 1 | | 1 (0)| 00:00:01 |
|* 5 | INDEX RANGE SCAN | IDX_B_C3 | 1 | | 0 (0)| 00:00:01 |
| 6 | TABLE ACCESS BY INDEX ROWID | B | 1 | 34 | 1 (0)| 00:00:01 |
------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
4 - access("A"."C1"='A_C1_03')
5 - access("A"."C3"="B"."C3")
Note
-----
- dynamic sampling used for this statement (level=2)
统计信息
----------------------------------------------------------
10 recursive calls
0 db block gets
26 consistent gets
0 physical reads
0 redo size
605 bytes sent via SQL*Net to client
523 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
-- 全表外联优化
SQL> select a.c1,b.c2 from a full join b on a.c3=b.c3 where a.c1='A_C1_03';
C1 C2
------------------------------------------------------------ ------------------------------------------------------------
A_C1_03 B_C2_03
执行计划
----------------------------------------------------------
Plan hash value: 708156715
-----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 68 | 4 (0)| 00:00:01 |
| 1 | NESTED LOOPS OUTER | | 1 | 68 | 4 (0)| 00:00:01 |
|* 2 | TABLE ACCESS FULL | A | 1 | 34 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS BY INDEX ROWID| B | 1 | 34 | 1 (0)| 00:00:01 |
|* 4 | INDEX RANGE SCAN | IDX_B_C3 | 1 | | 0 (0)| 00:00:01 |
-----------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("A"."C1"='A_C1_03')
4 - access("A"."C3"="B"."C3"(+))
Note
-----
- dynamic sampling used for this statement (level=2)
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
11 consistent gets
0 physical reads
0 redo size
605 bytes sent via SQL*Net to client
523 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
-- theta 连接优化
SQL> select a.c1,b.c2 from a join b on a.c3 != b.c3 where a.c1='A_C1_03';
C1 C2
------------------------------------------------------------ ------------------------------------------------------------
A_C1_03 B_C2_01
A_C1_03 B_C2_02
A_C1_03 B_C2_04
A_C1_03 B_C2_05
执行计划
----------------------------------------------------------
Plan hash value: 4030965610
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 4 | 272 | 6 (0)| 00:00:01 |
| 1 | NESTED LOOPS | | 4 | 272 | 6 (0)| 00:00:01 |
|* 2 | TABLE ACCESS FULL| A | 1 | 34 | 3 (0)| 00:00:01 |
|* 3 | TABLE ACCESS FULL| B | 4 | 136 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("A"."C1"='A_C1_03')
3 - filter("A"."C3"<>"B"."C3")
Note
-----
- dynamic sampling used for this statement (level=2)
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
16 consistent gets
0 physical reads
0 redo size
698 bytes sent via SQL*Net to client
523 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
4 rows processed