暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 在explain plan中,查询中的一个表甚至没有被扫描以进行连接,您知道为什么吗?

askTom 2018-09-19
228

问题描述

我正在运行一个查询,如下所示

解释计划
选择计数 (1)
来自A,B
其中A.列n1 = 1
和A.列2 = 3
和A.column3 = b.column3()


当我检查解释计划时,我可以看到排序聚合和其他东西,但是我在表B中看不到任何访问操作。
你能帮我回答优化器为什么这么做吗?

专家解答

假设b.column3上有一个主/唯一键约束,左连接B对结果没有影响。

这是因为对于A中的每一行,您都有at mostB中的一排。与内部联接不同,外部联接保留驱动表 (A) 中的所有行。所以没有必要读B。

但是要进行此优化,您必须有一个强制唯一性的约束:

set serveroutput off
create table t1 (
  c1 int 
);
create table t2 (
  c1 int 
);

insert into t1 values ( 1 );
insert into t1 values ( 2 );
insert into t2 values ( 1 );
commit;

select count (*) from t1
left   join t2
on     t1.c1 = t2.c1;

select * 
from   table(dbms_xplan.display_cursor(null, null, 'BASIC LAST'));

EXPLAINED SQL STATEMENT:                                       
------------------------                                       
select count (*) from t1 left   join t2 on     t1.c1 = t2.c1   
                                                               
Plan hash value: 4045007133                                    
                                                               
------------------------------------                           
| Id  | Operation           | Name |                           
------------------------------------                           
|   0 | SELECT STATEMENT    |      |                           
|   1 |  SORT AGGREGATE     |      |                           
|   2 |   HASH JOIN OUTER   |      |                           
|   3 |    TABLE ACCESS FULL| T1   |                           
|   4 |    TABLE ACCESS FULL| T2   |                           
------------------------------------  

alter table t2 add primary key ( c1 );

select count (*) from t1
left   join t2
on     t1.c1 = t2.c1;

select * 
from   table(dbms_xplan.display_cursor(null, null, 'BASIC LAST'));

EXPLAINED SQL STATEMENT:                                       
------------------------                                       
select count (*) from t1 left   join t2 on     t1.c1 = t2.c1   
                                                               
Plan hash value: 1634389831                                    
                                                               
-----------------------------------                            
| Id  | Operation          | Name |                            
-----------------------------------                            
|   0 | SELECT STATEMENT   |      |                            
|   1 |  SORT AGGREGATE    |      |                            
|   2 |   TABLE ACCESS FULL| T1   |                            
----------------------------------- 
复制

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论