10g和11g,优化器对外连接的处理对比
我反省,今天面试有个问题没有说清楚。
我给出的结论(而且这个结论我验证过)是:不要使用不必要的外连接,举了下面这个例子却没有说清楚。虽然最近感冒,状态不是很好,但最擅长的东西都没有表达清楚,泪流满面啊:(
多谢那位面试官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,优化器对外连接的处理对比的更多相关文章
- Oracle性能优化之 Oracle里的优化器
优化器(optimizer)是oracle数据库内置的一个核心子系统.优化器的目的是按照一定的判断原则来得到它认为的目标SQL在当前的情形下的最高效的执行路径,也就是为了得到目标SQL的最佳执行计划. ...
- Oracle的优化器介绍
Oracle优化器介绍 本文讲述了Oracle优化器的概念.工作原理和使用方法,兼顾了Oracle8i.9i以及最新的10g三个版本.理解本文将有助于您更好的更有效的进行SQL优化工作. RBO优化器 ...
- Oracle优化器介绍
Oracle优化器介绍 本文讲述了Oracle优化器的概念.工作原理和使用方法,兼顾了Oracle8i.9i以及最新的10g三个版本.理解本文将有助于您更好的更有效的进行SQL优化工作. RBO优化器 ...
- oracle优化器使用(oracle11g)
一:优化器介绍 优化器(optimizer)是oracle数据库内置的一个核心子系统.优化器的目的是按照一定的判断原则来得到它认为的目标SQL在当前的情形下的最高效的执行路径,也就是为了得到目标SQL ...
- Oracle 优化器_表连接
概述 在写SQL的时候,有时候涉及到的不仅只有一个表,这个时候,就需要表连接了.Oracle优化器处理SQL语句时,根据SQL语句,确定表的连接顺序(谁是驱动表,谁是被驱动表及 哪个表先和哪个表做链接 ...
- keras channels_last、preprocess_input、全连接层Dense、SGD优化器、模型及编译
channels_last 和 channels_first keras中 channels_last 和 channels_first 用来设定数据的维度顺序(image_data_format). ...
- Oracle 课程五之优化器和执行计划
课程目标 完成本课程的学习后,您应该能够: •优化器的作用 •优化器的类型 •优化器的优化步骤 •扫描的基本类型 •表连接的执行计划 •其他运算方式的执行计划 •如何看执行计划顺序 •如何获取执行计划 ...
- ORACLE优化器RBO与CBO介绍总结
RBO和CBO的基本概念 Oracle数据库中的优化器又叫查询优化器(Query Optimizer).它是SQL分析和执行的优化工具,它负责生成.制定SQL的执行计划.Oracle的优化器有两种,基 ...
- PLSQL_性能优化系列04_Oracle Optimizer优化器
2014-09-25 Created By BaoXinjian
随机推荐
- Override ListView getAdapter造成的后果
近期工作中,发现了一个bug,是和ListView Adapter有关的.产生了FC,描写叙述信息大约是 "The content of the adapter has changed bu ...
- 判断jsp中是否存在某个javascript函数
//判断父页是否存在某个javascript函数 function fnExist(fnName) { //return fnName in this && eval(fnName) ...
- Redis学习手册(内存优化)
自从Redis 2.2之后,很多数据类型都可以通过特殊编码的方式来进行存储空间的优化.其中,Hash.List和由Integer组成的Sets都可以通过该方式来优化存储结构,以便占用更少的空间,在有些 ...
- Mac system快捷键
官方的快捷键是 control+command+F 进行窗口和全屏的切换. 1042282500@qq.com yss12313
- eclipse下修改项目名导致tomcat内发布名不一致的解决方法 .
eclipse下修改项目名导致tomcat内发布名不一致的解决方法 . ------------------------------------------------------- 解决方案: 直接 ...
- Cisco 交换机与路由器故障处理方法分享
一.网络的复杂性 一般网络包括路由.拨号.交换.视频.WAN(ISDN.帧中继.ATM.…).LAN.VLAN.… 二.故障处理模型 1. 界定问题(Define the Problem) 详细而精确 ...
- 使用HttpURLConnection实现在android客户端和服务器之间传递对象
一般情况下,客户端和服务端的数据交互都是使用json和XML,相比于XML,json更加轻量级,并且省流量,但是,无论我们用json还是用xml,都需要我们先将数据封装成json字符串或者是一个xml ...
- android开发之使用上下文菜单
android中的上下文菜单类似于PC上的鼠标右键单击,不同的是android上没有鼠标这一概念,更谈不上右键单击,在android中,一般是长按某个View,调出上下文菜单.与OptionsMenu ...
- linux部署tomcat
安装说明 安装环境:CentOS-6.5安装方式:源码安装 软件:apache-tomcat-6.0.45.tar.gz下载地址:http://tomcat.apache.org/download-6 ...
- ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值
检查插入的值是否大于该字段数据类型约束的长度. 这个异常是指,用户向数据库执行插入数据操作时,某条数据的某个字段值过长,如 果是varchar2类型的,当长度超过2000,--4000(最大值)之间的 ...