1. 程式人生 > >二十七、關聯查詢中表的連線順序對SQL

二十七、關聯查詢中表的連線順序對SQL

1、基於代價時代(CBO)的表連線

drop table tab_big;
drop table tab_small;
create table tab_big  as select * from dba_objects where rownum<=30000;
create table tab_small  as select * from dba_objects where rownum<=10;
set autotrace traceonly
set linesize 1000
set timing on 
select count(*) from tab_big,tab_small   ;  
select count(*) from tab_small,tab_big   ;

SQL> select count(*) from tab_big,tab_small   ;

已用時間:  00: 00: 00.04

執行計劃
----------------------------------------------------------
Plan hash value: 177389953

---------------------------------------------------------------------------
| Id  | Operation             | Name      | Rows  | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |           |     1 |  1186   (1)| 00:00:15 |
|   1 |  SORT AGGREGATE       |           |     1 |            |          |
|   2 |   MERGE JOIN CARTESIAN|           |   330K|  1186   (1)| 00:00:15 |
|   3 |    TABLE ACCESS FULL  | TAB_SMALL |    10 |     3   (0)| 00:00:01 |
|   4 |    BUFFER SORT        |           | 33012 |  1183   (1)| 00:00:15 |
|   5 |     TABLE ACCESS FULL | TAB_BIG   | 33012 |   118   (0)| 00:00:02 |
---------------------------------------------------------------------------

Note
-----
   - dynamic sampling used for this statement (level=2)


統計資訊
----------------------------------------------------------
          0  recursive calls
          0  db block gets
        425  consistent gets
          0  physical reads
          0  redo size
        527  bytes sent via SQL*Net to client
        520  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL> select count(*) from tab_small,tab_big   ;

已用時間:  00: 00: 00.01

執行計劃
----------------------------------------------------------
Plan hash value: 177389953

---------------------------------------------------------------------------
| Id  | Operation             | Name      | Rows  | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |           |     1 |  1186   (1)| 00:00:15 |
|   1 |  SORT AGGREGATE       |           |     1 |            |          |
|   2 |   MERGE JOIN CARTESIAN|           |   330K|  1186   (1)| 00:00:15 |
|   3 |    TABLE ACCESS FULL  | TAB_SMALL |    10 |     3   (0)| 00:00:01 |
|   4 |    BUFFER SORT        |           | 33012 |  1183   (1)| 00:00:15 |
|   5 |     TABLE ACCESS FULL | TAB_BIG   | 33012 |   118   (0)| 00:00:02 |
---------------------------------------------------------------------------

Note
-----
   - dynamic sampling used for this statement (level=2)


統計資訊
----------------------------------------------------------
          0  recursive calls
          0  db block gets
        425  consistent gets
          0  physical reads
          0  redo size
        527  bytes sent via SQL*Net to client
        520  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          1  rows processed

在代價時代,ORACLE優化器會比較兩種寫法的代價大小,進行比較,選擇代價小的寫法。

2、基於規則時代的表連線順序

select /*+rule*/ count(*) from tab_big,tab_small ;  
select /*+rule*/ count(*) from tab_small,tab_big ;

SQL> select /*+rule*/ count(*) from tab_big,tab_small ;

已用時間:  00: 00: 00.00

執行計劃
----------------------------------------------------------
Plan hash value: 41936691

-----------------------------------------
| Id  | Operation           | Name      |
-----------------------------------------
|   0 | SELECT STATEMENT    |           |
|   1 |  SORT AGGREGATE     |           |
|   2 |   NESTED LOOPS      |           |
|   3 |    TABLE ACCESS FULL| TAB_SMALL |
|   4 |    TABLE ACCESS FULL| TAB_BIG   |
-----------------------------------------

Note
-----
   - rule based optimizer used (consider using cbo)


統計資訊
----------------------------------------------------------
          0  recursive calls
          0  db block gets
       4223  consistent gets
          0  physical reads
          0  redo size
        527  bytes sent via SQL*Net to client
        520  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 /*+rule*/ count(*) from tab_small,tab_big ;

已用時間:  00: 00: 00.07

執行計劃
----------------------------------------------------------
Plan hash value: 2127005654

-----------------------------------------
| Id  | Operation           | Name      |
-----------------------------------------
|   0 | SELECT STATEMENT    |           |
|   1 |  SORT AGGREGATE     |           |
|   2 |   NESTED LOOPS      |           |
|   3 |    TABLE ACCESS FULL| TAB_BIG   |
|   4 |    TABLE ACCESS FULL| TAB_SMALL |
-----------------------------------------

Note
-----
   - rule based optimizer used (consider using cbo)


統計資訊
----------------------------------------------------------
          0  recursive calls
          0  db block gets
      90422  consistent gets
          0  physical reads
          0  redo size
        527  bytes sent via SQL*Net to client
        520  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed