我反省,今天面试有个问题没有说清楚。
我给出的结论(而且这个结论我验证过)是:不要使用不必要的外连接,举了下面这个例子却没有说清楚。虽然最近感冒,状态不是很好,但最擅长的东西都没有表达清楚,泪流满面啊:(
多谢那位面试官DBA的提醒,我以后要多多注意啊,要把自己擅长的东西说清楚。
10g:
test@ORA10G> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi
PL/SQL Release 10.2.0.5.0 - Production
CORE 10.2.0.5.0 Production
TNS for IBM/AIX RISC System/6000: Version 10.2.0.5.0 - Productio
NLSRTL Version 10.2.0.5.0 - Production
创建测试环境:
drop table t1;
drop table t2;
create table t1 as select * from dba_objects;
create table t2 as select * from t1;
create index i_t2_objectid on t2(object_id) parallel 3;
alter index i_t2_objectid noparallel;
analyze table t1 compute statistics for table for all indexes for all indexed columns;
analyze table t2 compute statistics for table for all indexes for all indexed columns;
执行SQL并查看其执行计划:
test@ORA10G> select t1.object_id, t2.object_id, t1.object_name, t2.object_name
2 from t1, t2
3 where t1.object_id = t2.object_id(+)
4 and t2.object_id in (3, 6, 11, 28);
Execution Plan
----------------------------------------------------------
Plan hash value: 1594007018
---------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
---------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 4 | 600 | | 32331 (1)| 00:06:28 |
|* 1 | FILTER | | | | | | |
|* 2 | HASH JOIN RIGHT OUTER| | 4 | 600 | 173M| 32331 (1)| 00:06:28 |
| 3 | TABLE ACCESS FULL | T2 | 2196K| 148M| | 7109 (1)| 00:01:26 |
| 4 | TABLE ACCESS FULL | T1 | 2196K| 165M| | 7110 (1)| 00:01:26 |
---------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter("T2"."OBJECT_ID"=3 OR "T2"."OBJECT_ID"=6 OR "T2"."OBJECT_ID"=11
OR "T2"."OBJECT_ID"=28)
2 - access("T1"."OBJECT_ID"="T2"."OBJECT_ID"(+))
Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
64216 consistent gets
0 physical reads
0 redo size
855 bytes sent via SQL*Net to client
492 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
4 rows processed
从上面结果可以看到,即使t2中字段object_id上有索引,在10g中也是用不到的。Oracle先选择将两个表走hash join right outer连接,然后将结果进行filter过滤。
同样的操作,下面看11g将会怎样处理:
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
创建测试环境:
drop table t1;
drop table t2;
create table t1 as select * from dba_objects;
create table t2 as select * from t1;
create index i_t2_objectid on t2(object_id) parallel 3;
alter index i_t2_objectid noparallel;
analyze table t1 compute statistics for table for all indexes for all indexed columns;
analyze table t2 compute statistics for table for all indexes for all indexed columns;
执行SQL并查看其执行计划:
SQL> set linesize 400 pagesize 400
SQL> set autot trace
SQL>
SQL> select t1.object_id,t1.object_name,t2.object_id,t2.object_name
2 from t1,t2
3 where t1.object_id=t2.object_id(+)
4 and t2.object_id in (3,6,11,28);
Execution Plan
----------------------------------------------------------
Plan hash value: 1372208711
-----------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 12 | 1896 | 57 (2)| 00:00:01 |
|* 1 | HASH JOIN | | 12 | 1896 | 57 (2)| 00:00:01 |
| 2 | INLIST ITERATOR | | | | | |
| 3 | TABLE ACCESS BY INDEX ROWID| T2 | 12 | 948 | 5 (0)| 00:00:01 |
|* 4 | INDEX RANGE SCAN | I_T2_OBJECTID | 4 | | 4 (0)| 00:00:01 |
|* 5 | TABLE ACCESS FULL | T1 | 131 | 10349 | 51 (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - access("T1"."OBJECT_ID"="T2"."OBJECT_ID")
4 - access("T2"."OBJECT_ID"=3 OR "T2"."OBJECT_ID"=6 OR "T2"."OBJECT_ID"=11 OR
"T2"."OBJECT_ID"=28)
5 - filter("T1"."OBJECT_ID"=3 OR "T1"."OBJECT_ID"=6 OR "T1"."OBJECT_ID"=11 OR
"T1"."OBJECT_ID"=28)
Statistics
----------------------------------------------------------
4 recursive calls
0 db block gets
242 consistent gets
0 physical reads
0 redo size
878 bytes sent via SQL*Net to client
523 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
4 rows processed
从上面可以看出,11g中,Oracle是忽略了外连接的。Oracle在11g中优化器应该做了优化。
我今天本来想表达的意思是:10g中外连接在这种情况下其实是先两个表full table scan的结果做了hash 外连接,将hash的结果做fillter过滤。而11g会忽略掉外连接,将t2的id列会走索引,然后跟另一个表做join连接。
 
 
 

10g和11g,优化器对外连接的处理对比的更多相关文章

  1. Oracle性能优化之 Oracle里的优化器

    优化器(optimizer)是oracle数据库内置的一个核心子系统.优化器的目的是按照一定的判断原则来得到它认为的目标SQL在当前的情形下的最高效的执行路径,也就是为了得到目标SQL的最佳执行计划. ...

  2. Oracle的优化器介绍

    Oracle优化器介绍 本文讲述了Oracle优化器的概念.工作原理和使用方法,兼顾了Oracle8i.9i以及最新的10g三个版本.理解本文将有助于您更好的更有效的进行SQL优化工作. RBO优化器 ...

  3. Oracle优化器介绍

    Oracle优化器介绍 本文讲述了Oracle优化器的概念.工作原理和使用方法,兼顾了Oracle8i.9i以及最新的10g三个版本.理解本文将有助于您更好的更有效的进行SQL优化工作. RBO优化器 ...

  4. oracle优化器使用(oracle11g)

    一:优化器介绍 优化器(optimizer)是oracle数据库内置的一个核心子系统.优化器的目的是按照一定的判断原则来得到它认为的目标SQL在当前的情形下的最高效的执行路径,也就是为了得到目标SQL ...

  5. Oracle 优化器_表连接

    概述 在写SQL的时候,有时候涉及到的不仅只有一个表,这个时候,就需要表连接了.Oracle优化器处理SQL语句时,根据SQL语句,确定表的连接顺序(谁是驱动表,谁是被驱动表及 哪个表先和哪个表做链接 ...

  6. keras channels_last、preprocess_input、全连接层Dense、SGD优化器、模型及编译

    channels_last 和 channels_first keras中 channels_last 和 channels_first 用来设定数据的维度顺序(image_data_format). ...

  7. Oracle 课程五之优化器和执行计划

    课程目标 完成本课程的学习后,您应该能够: •优化器的作用 •优化器的类型 •优化器的优化步骤 •扫描的基本类型 •表连接的执行计划 •其他运算方式的执行计划 •如何看执行计划顺序 •如何获取执行计划 ...

  8. ORACLE优化器RBO与CBO介绍总结

    RBO和CBO的基本概念 Oracle数据库中的优化器又叫查询优化器(Query Optimizer).它是SQL分析和执行的优化工具,它负责生成.制定SQL的执行计划.Oracle的优化器有两种,基 ...

  9. PLSQL_性能优化系列04_Oracle Optimizer优化器

    2014-09-25 Created By BaoXinjian

随机推荐

  1. 【Servlet】Servlet应用的get、post访问及和JSP的配合使用

    Servlet是一种服务器端的Java应用程序,具有独立于平台和协议的特性,可以生成动态的Web页面. 它担当客户请求(Web浏览器或其他HTTP客户程序)与服务器响应(HTTP服务器上的数据库或应用 ...

  2. web app 相关记录

    今天在手机浏览器上运行cocos2d-html5的sample, crystalcraze运行起来只有10~20帧, moonwarrior只有20~30帧,很不理想的数据: 记录下几个web app ...

  3. 原创C# 枚举 多状态 操作

    C# 中枚举类型是一种值类型,目前(vs2012)还不能用于泛型. 此类型最多的用处是标识一组相同类型的状态量或常量,比如: 状态量 示例一 [Flags] public enum Connectio ...

  4. 定制操作(传递函数或lambda表达式)

    很多算法都会比较输入序列中的元素.默认情况下,这类算法使用元素类型的<或==运算符完成比较.标准库还为这些算法定义了额外的版本,允许我们提供自己定义的操作来代替默认运算符. 例如,sort算法默 ...

  5. android 开发过程中碰到的 Failed to create the part's controls 问题

    在开发android的过程中,遇到一个很奇怪的问题,出现了“ Failed to create the part's controls” 的错误,查询了N多资料,然后逐条删除代码测试, 后来发现是变量 ...

  6. [Form Builer]Locking Mode and LOCK_RECORD

    Locking Mode Property Description Specifies when Oracle Forms tries to obtain database locks on rows ...

  7. Socket.io各个发送消息的含义

    // send to current request socket client socket.emit('message', "this is a test"); // send ...

  8. angularjs + springmvc 上传和下载

    jsp: <form ng-submit="uploadFile()" class="form-horizontal" enctype="mul ...

  9. 免费vpn

    http://www.freevpnmac.com/macvpn/ 下边有个滑动解锁,拖动鼠标至右边解锁,点击Get vpn info,得到vpn地址ip和用户密码. 我用安卓手机测试了下完全可以,但 ...

  10. c语言中数组相关问题

    c语言中数组相关问题: 1.数组基本定义: 相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字称为数组名,编号称为下标.组成数组 ...