Oracle多表连接优化测试

在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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值