11gr2全外連線優化執行計劃(三)
在11.2中,Oracle對於全外連線的執行計劃進行了優化。
這篇進一步介紹NATIVE_FULL_OUTER_JOIN提示。
11gr2全外連線優化執行計劃:http://yangtingkun.itpub.net/post/468/506826
11gr2全外連線優化執行計劃(二):http://yangtingkun.itpub.net/post/468/506876
雖然上一篇介紹了NATIVE_FULL_OUTER_JOIN和NO_NATIVE_FULL_OUTER_JOIN兩個HINT,但是實際上NATIVE_FULL_OUTER_JOIN並沒有發揮任何的作用,因為Oracle對全外連線的優化使得新的執行計劃的代價比原始執行計劃要低,所以Oracle預設就選擇這個執行計劃,因此看不到NATIVE_FULL_OUTER_JOIN提示的效果。
SQL> SET AUTOT ON
SQL> SELECT T1.ID, T2.ID
2 FROM T1 FULL OUTER JOIN T2
3 ON T1.ID = T2.ID;
ID ID
---------- ----------
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9
10
1
0
已選擇11行。
執行計劃
----------------------------------------------------------
Plan hash value: 53297166
----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 9 | 234 | 9 (12)| 00:00:01 |
| 1 | VIEW | VW_FOJ_0 | 9 | 234 | 9 (12)| 00:00:01 |
|* 2 | HASH JOIN FULL OUTER| | 9 | 234 | 9 (12)| 00:00:01 |
| 3 | TABLE ACCESS FULL | T1 | 9 | 117 | 4 (0)| 00:00:01 |
| 4 | TABLE ACCESS FULL | T2 | 9 | 117 | 4 (0)| 00:00:01 |
----------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("T1"."ID"="T2"."ID")
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
733 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)
11 rows processed
嘗試在RBO情況下執行:
SQL> ALTER SESSION SET OPTIMIZER_MODE = CHOOSE;
會話已更改。
SQL> SELECT T1.ID, T2.ID
2 FROM T1 FULL OUTER JOIN T2
3 ON T1.ID = T2.ID;
ID ID
---------- ----------
2 2
3 3
4 4
5 5
6 6
7 7
8 8
已選擇7行。
執行計劃
----------------------------------------------------------
Plan hash value: 3374424389
-----------------------------------------
| Id | Operation | Name |
-----------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | VIEW | VW_FOJ_0 |
| 2 | MERGE JOIN | |
| 3 | SORT JOIN | |
| 4 | TABLE ACCESS FULL| T2 |
|* 5 | SORT JOIN | |
| 6 | TABLE ACCESS FULL| T1 |
-----------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
5 - access("T1"."ID"="T2"."ID")
filter("T1"."ID"="T2"."ID")
Note
-----
- rule based optimizer used (consider using cbo)
統計資訊
----------------------------------------------------------
1 recursive calls
0 db block gets
14 consistent gets
0 physical reads
0 redo size
700 bytes sent via SQL*Net to client
520 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
2 sorts (memory)
0 sorts (disk)
7 rows processed
SQL> SELECT /*+ NATIVE_FULL_OUTER_JOIN */ T1.ID, T2.ID
2 FROM T1 FULL OUTER JOIN T2
3 ON T1.ID = T2.ID;
ID ID
---------- ----------
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9
10
1
0
已選擇11行。
執行計劃
----------------------------------------------------------
Plan hash value: 53297166
----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 9 | 234 | 9 (12)| 00:00:01 |
| 1 | VIEW | VW_FOJ_0 | 9 | 234 | 9 (12)| 00:00:01 |
|* 2 | HASH JOIN FULL OUTER| | 9 | 234 | 9 (12)| 00:00:01 |
| 3 | TABLE ACCESS FULL | T1 | 9 | 117 | 4 (0)| 00:00:01 |
| 4 | TABLE ACCESS FULL | T2 | 9 | 117 | 4 (0)| 00:00:01 |
----------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("T1"."ID"="T2"."ID")
Note
-----
- dynamic sampling used for this statement (level=2)
統計資訊
----------------------------------------------------------
7 recursive calls
0 db block gets
31 consistent gets
0 physical reads
0 redo size
733 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)
11 rows processed
RBO下顯然不會出現最新的執行計劃,而加上NATIVE_FULL_OUTER_JOIN提示後,執行計劃變為新的外連線。
需要注意RBO的執行計劃和執行結果都是錯誤的,這裡是個bug,詳細描述可以參考:http://yangtingkun.itpub.net/post/468/507056
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28628435/viewspace-1984429/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 11gr2全外連線優化執行計劃優化
- 11gr2全外連線優化執行計劃(二)優化
- 11gr2全外連線最佳化執行計劃(三)
- 11gr2全外連線最佳化執行計劃
- 11gr2全外連線最佳化執行計劃(二)
- 【執行計劃】Oracle 11gR2使用Full outer Joins執行計劃完成全外連線查詢Oracle
- 11GR2中RBO執行全外連線結果錯誤
- 11GR2的delete全表的執行計劃變化delete
- 【優化】Oracle 執行計劃優化Oracle
- 分析執行計劃優化SQLORACLE的執行計劃(轉)優化SQLOracle
- 【優化】ORACLE執行計劃分析優化Oracle
- SQL優化案例-從執行計劃定位SQL問題(三)SQL優化
- Oracle優化案例-從執行計劃定位SQL問題(三)Oracle優化SQL
- Oracle內連線、外連線、右外連線、全外連線小總結Oracle
- Mysql SQL最佳化系列之——執行計劃連線方式淺釋MySql
- 【sql調優之執行計劃】獲取執行計劃SQL
- Oracle 左外連線、右外連線、全外連線小總結Oracle
- Sqlserver執行計劃中表的四種連線方式SQLServer
- 【SQL】Oracle的內連線、左外連線、右外連線及全外連線SQLOracle
- 【MySQL】MySQL的執行計劃及索引優化MySql索引優化
- MySQL 5.7 優化不能只看執行計劃MySql優化
- 使用leading(,)優化sql執行計劃優化SQL
- 【效能優化】執行計劃與直方圖優化直方圖
- SQL的四種連線:內連線 左外連線 右外連線 全連線SQL
- 分析執行計劃最佳化SQLORACLE的執行計劃(轉)SQLOracle
- 例項解析外連線 內連線 自連線 全連線
- 【執行計劃】資料訪問方式,連線方式及方法
- Oracle 表連線 篩選欄位執行計劃不正確Oracle
- PostgreSQL執行計劃變化SQL
- 轉摘_使用leading(,)優化sql執行計劃優化SQL
- MYSQL語法:左連線、右連線、內連線、全外連線MySql
- 深入理解SQL的四種連線-左外連線、右外連線、內連線、全連線SQL
- Oracle檢視執行計劃(三)Oracle
- 【sql調優之執行計劃】使用hint(三)Hints for Query TransformationsSQLORM
- MySQL查詢優化之優化器工作流程以及優化的執行計劃生成MySql優化
- mysql調優之——執行計劃explainMySqlAI
- PostgreSQL優化案例之 反連線與外連線等價改寫SQL優化
- MySQL優化從執行計劃開始(explain超詳細)MySql優化AI