不,它不会为内部或外部联接构建两个表的笛卡尔积。
当一个或多个表对语句中的任何其他表没有任何连接条件时,数据库使用笛卡尔连接。" Database SQL Tuning Guide
因此,在您的示例中,仅当 where 子句为空时才进行笛卡尔连接:
EXPLAIN PLAN FOR
SELECT a.a1, b.b1 FROM a,b;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
-----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 40 | 240 | 10 (0)| 00:00:01 |
| 1 | MERGE JOIN CARTESIAN| | 40 | 240 | 10 (0)| 00:00:01 |
| 2 | TABLE ACCESS FULL | B | 4 | 12 | 3 (0)| 00:00:01 |
| 3 | BUFFER SORT | | 10 | 30 | 7 (0)| 00:00:01 |
| 4 | TABLE ACCESS FULL | A | 10 | 30 | 2 (0)| 00:00:01 |
-----------------------------------------------------------------------------
SELECT a.a1, b.b1 FROM a,b;
它通常使用三种连接方法之一,在同一个document中进行了解释。
在您的情况下,它使用“哈希连接”进行内部连接:
EXPLAIN PLAN FOR
SELECT a.a1, b.b1 FROM a,b WHERE a.a1 = b.b1;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 4 | 24 | 6 (0)| 00:00:01 |
|* 1 | HASH JOIN | | 4 | 24 | 6 (0)| 00:00:01 |
| 2 | TABLE ACCESS FULL| B | 4 | 12 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| A | 10 | 30 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("A"."A1"="B"."B1")
以及用于外部联接的“散列联接外部”:
EXPLAIN PLAN FOR
SELECT a.a1, b.b1 FROM a,b WHERE a.a1 = b.b1(+);
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 10 | 60 | 6 (0)| 00:00:01 |
|* 1 | HASH JOIN OUTER | | 10 | 60 | 6 (0)| 00:00:01 |
| 2 | TABLE ACCESS FULL| A | 10 | 30 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| B | 4 | 12 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("A"."A1"="B"."B1"(+))