SQL的外連線對內部表的限制
SQL在進行外連線操作時,where子句中不能對內部表的欄位進行限制,否則外連線會失效。
Oracle會將外連線直接轉換為內連線。
測試步驟如下:
1.建立測試表
SQL> create table t
2 (a varchar2(10),
3 b varchar2(10));
Table created
SQL>
SQL> create table s
2 (a varchar2(10),
3 b varchar2(10));
Table created
2.檢查外連線的執行計劃(假設連線條件為t.a=s.a)
SQL> explain plan for
2 select t.a,s.*
3 from t left outer join s on (t.a=s.a) ;
Explained
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
---------------------------------------------------------------------Plan hash value: 269431714
---------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 21 | 5 (20)| 00:00:01 |
|* 1 | HASH JOIN OUTER | | 1 | 21 | 5 (20)| 00:00:01 |
| 2 | TABLE ACCESS FULL| T | 1 | 7 | 2 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| S | 1 | 14 | 2 (0)| 00:00:01 |
---------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("T"."A"="S"."A"(+))
3.當對外部表進行條件限制時,注意執行計劃還是外連線的
SQL> explain plan for
2 select t.a,s.*
3 from t left outer join s on (t.a=s.a)
4 where t.a='aa';
Explained
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
---------------------------------------------------------------------
Plan hash value: 269431714
---------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 21 | 5 (20)| 00:00:01 |
|* 1 | HASH JOIN OUTER | | 1 | 21 | 5 (20)| 00:00:01 |
|* 2 | TABLE ACCESS FULL| T | 1 | 7 | 2 (0)| 00:00:01 |
|* 3 | TABLE ACCESS FULL| S | 1 | 14 | 2 (0)| 00:00:01 |
---------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("T"."A"="S"."A"(+))
2 - filter("T"."A"='aa')
3 - filter("S"."A"(+)='aa')
4.當where子句中出現內部表的欄位條件限制時,注意執行計劃變化,已經不再是外連線,而是內連線了
SQL> explain plan for
2 select t.a,s.*
3 from t left outer join s on (t.a=s.a)
4 where s.a='aa';
Explained
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 59042520
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 21 | 5 (20)| 00:00:01 |
|* 1 | HASH JOIN | | 1 | 21 | 5 (20)| 00:00:01 |
|* 2 | TABLE ACCESS FULL| T | 1 | 7 | 2 (0)| 00:00:01 |
|* 3 | TABLE ACCESS FULL| S | 1 | 14 | 2 (0)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("T"."A"="S"."A")
2 - filter("T"."A"='aa')
3 - filter("S"."A"='aa')
Note
-----
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
- dynamic sampling used for this statement (level=2)
21 rows selected
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10009036/viewspace-1061284/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【SQL】Oracle的內連線、左外連線、右外連線及全外連線SQLOracle
- sql 內連線和外連線SQL
- SQL的四種連線:內連線 左外連線 右外連線 全連線SQL
- sql內連結,外連線SQL
- 外網連線內部區域網的方法--ip 埠對映
- SQL Server中內連線和外連線的區別SQLServer
- 深入理解SQL的四種連線-左外連線、右外連線、內連線、全連線SQL
- Linux對外連線埠數限制Linux
- 你真的會玩SQL嗎?內連線、外連線SQL
- 內連線、外連線
- Oracle 表連線方式詳解(外連結、內連線、自連線)Oracle
- sql和hql中join語句區別,以及hibernate中內連線,迫切內連線,左外連線,迫切左外連線,右外連線的區別(合集)...SQL
- Oracle優化器內部處理的表連線方式Oracle優化
- oracle sql內連線_左(右)連線_全外連線_幾種寫法OracleSQL
- 【SQL】一條外連線和內連線混合使用的SQL語句搞定同事一迷茫需求SQL
- Oracle內連線、外連線、右外連線、全外連線小總結Oracle
- 外連線轉換為內連線的情況
- 轉載:內連線與外連線的區別
- 內連線、外連線總結
- T-SQL學習中–內聯接,外連線,交叉連線SQL
- SQL SERVER 自連線、外連線SQLServer
- 【SQL】表連線 --半連線SQL
- 行的儲存(塊內連線與塊外連線)
- SQL改寫系列九:外連線轉內連線的常見場景與錯誤SQL
- 內聯,左外聯,右外聯,全連線,交叉連線 的區別
- 幾種表的連線方式(SQL)SQL
- SQL改寫系列九:外連線轉內連線的常見場景與錯誤-2SQL
- 例項解析外連線 內連線 自連線 全連線
- MySQL筆記3——內連線/外連線、多表連線MySql筆記
- SQL 三表連線SQL
- MYSQL語法:左連線、右連線、內連線、全外連線MySql
- Mysql——內外連線,事物,索引MySql索引
- 【SQL 學習】表連線SQL
- 行連線的一點內部儲存測試!
- SQL裡3個表的連線查詢SQL
- SQL—對資料表內容的基本操作SQL
- sybase的外連線
- Oracle 內外連線 join 總結Oracle