二十七、關聯查詢中表的連線順序對SQL
阿新 • • 發佈:2018-12-10
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