问题描述
你好,
我有一个示例,下面我不确定oracle如何执行where子句。
选择a.id,b.column_A,b.column_B,b.column_C
从左连接B
在a.id = b.id上
其中b.column_C = “是”
我的问题是,oracle执行 'where' 子句首先从表b过滤记录,然后做连接。
或者它会先加入两个表,然后过滤加入的结果。
如果是第二个猜测,它实际上会将此左联接转换为内部联接,对吗?
我有一个示例,下面我不确定oracle如何执行where子句。
选择a.id,b.column_A,b.column_B,b.column_C
从左连接B
在a.id = b.id上
其中b.column_C = “是”
我的问题是,oracle执行 'where' 子句首先从表b过滤记录,然后做连接。
或者它会先加入两个表,然后过滤加入的结果。
如果是第二个猜测,它实际上会将此左联接转换为内部联接,对吗?
专家解答
是后者。
因此,“on” 是连接条件,而 * where * 子句是过滤条件。这就是为什么您会看到优化器选择内部联接而不是外部联接的原因
将此与您的所有者条款作为联接的 * 一部分 * 进行比较
因此,“on” 是连接条件,而 * where * 子句是过滤条件。这就是为什么您会看到优化器选择内部联接而不是外部联接的原因
SQL> create table a as select object_id id, d.* from dba_objects d;
Table created.
SQL> create table b as select * from a;
Table created.
SQL>
SQL> set autotrace traceonly explain
SQL> select *
2 from A left join B
3 on a.id = b.id
4 where b.owner = 'XXXX';
Execution Plan
----------------------------------------------------------
Plan hash value: 4090908061
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 2232 | 597K| 881 (1)| 00:00:01 |
|* 1 | HASH JOIN | | 2232 | 597K| 881 (1)| 00:00:01 |
|* 2 | TABLE ACCESS FULL| B | 2232 | 298K| 439 (1)| 00:00:01 |
| 3 | TABLE ACCESS FULL| A | 78404 | 10M| 441 (1)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("A"."ID"="B"."ID")
2 - filter("B"."OWNER"='XXXX')
SQL> set autotrace off
SQL> select *
2 from A left join B
3 on a.id = b.id
4 where b.owner = 'XXXX'; <=== nothing matches this
no rows selected
将此与您的所有者条款作为联接的 * 一部分 * 进行比较
SQL> set autotrace off SQL> set feedback only SQL> select * 2 from A left join B 3 on a.id = b.id 4 and b.owner = 'XXXX'; 78404 rows selected. <<====
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




