设为首页 收藏本站
查看: 429|回复: 0

[经验分享] RBO下,oracle如何选择驱动表

[复制链接]

尚未签到

发表于 2016-7-29 10:42:23 | 显示全部楼层 |阅读模式
  --目的:弄清楚RBO下,oracle如何选择驱动表
--连接到部门测试机器10.188.239.68进行测试操作
  CONN CRM1/CRM1@TEST
  --********************************************************
--1测试环境说明
--********************************************************
--a 表记录数量
--XSTDDXX1 6663; XSTDDXX2 81467; KHVKHDA0 4438
--b 表索引
--xstddxx1:dhao00,khdm00,ywrq00,ywry00,ywzgry
--xstddxx2:(dhao00,jydm00)
--c 优化器模式
SQL> show parameter optimizer_mode
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
optimizer_mode                       string      CHOOSE
  --d 数据库版本
SQL> SELECT * FROM V$VERSION;
BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
PL/SQL Release 9.2.0.1.0 - Production
CORE    9.2.0.1.0       Production
TNS for 32-bit Windows: Version 9.2.0.1.0 - Production
NLSRTL Version 9.2.0.1.0 - Production
  --****************************************************************
--2、将优化器模式切换为rule
--****************************************************************
SQL> alter session set optimizer_mode=rule;
  会话已更改。
  --****************************************************************
--3、对于2个表xstddxx1,xstddxx2的查询
--使用同样的sql语句中,仅调换from字句中,2个表的顺序
--****************************************************************
  --**************************语句1的执行计划
select a.dhao00,a.khdm00,a.ywrq00,b.jydm00,b.sl0000
from xstddxx1 a,xstddxx2 b
where a.dhao00=b.dhao00;
  已选择81467行。
  已用时间:  00: 00: 02.02
  Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=RULE
   1    0   NESTED LOOPS
   2    1     TABLE ACCESS (FULL) OF 'XSTDDXX2'
   3    1     TABLE ACCESS (BY INDEX ROWID) OF 'XSTDDXX1'
   4    3       INDEX (UNIQUE SCAN) OF 'XSTDDXX1_DHAO00_PK' (UNIQUE)
  
Statistics
----------------------------------------------------------
          0  recursive calls   :递归调用。一般原因:dictionary cache未命中;动态存储扩展;PL/SQL语句
          0  db block gets    :bufer中读取的block数量,用于insert,update,delete,select for update
     174530  consistent gets   :bufer中读取的用于查询(除掉select for update)的block数量。 db blocks gets+consistent gets= logical read
          0  physical reads    :从磁盘上读取的block数量
          0  redo size      :bytes,写到redo logs的数据量
    3546854  bytes sent via SQL*Net to client
      60244  bytes received via SQL*Net from client
       5433  SQL*Net roundtrips to/from client
          0  sorts (memory)    :内存排序次数
          0  sorts (disk)     :磁盘排序次数;与sort_area_size有关
      81467  rows processed
--以xstddxx2为驱动表,与xstddxx1产生嵌套循环连接
  
--**************************语句2的执行计划
select a.dhao00,a.khdm00,a.ywrq00,b.jydm00,b.sl0000
from xstddxx2 b,xstddxx1 a
where a.dhao00=b.dhao00;
  已用时间:  00: 00: 02.00
  Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=RULE
   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'XSTDDXX2'
   2    1     NESTED LOOPS
   3    2       TABLE ACCESS (FULL) OF 'XSTDDXX1'
   4    2       INDEX (RANGE SCAN) OF 'XSTDDXX2_DH_JY_PK' (UNIQUE)
  Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
      39350  consistent gets
          0  physical reads
          0  redo size
    3544332  bytes sent via SQL*Net to client
      60244  bytes received via SQL*Net from client
       5433  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
      81467  rows processed
--以xstddxx1为驱动表,与xstddxx2产生嵌套循环连接
  --***************************************************************************
--4、初层次理解:1、RBO下,对于2个表的操作,FROM子句中,RBO选择最右的表作为驱动表
--               2、对于NESTED LOOPS、HASH JOIN、SORT MERGE JOIN方式,驱动表选择较小的表,速度会更快
--               3、存在主、外键关系的表,主键由oracle自动建立索引,外键上最好也建索引,以避免全表扫描
--***************************************************************************
  
--***************************************************************************
--5、下面看一下3个表的情况下,RBO如何选择驱动表
--***************************************************************************
  --********************************************************************语句1
select a.dhao00,a.khdm00,c.khmc00,a.ywrq00,b.jydm00,b.sl0000
from xstddxx1 a,xstddxx2 b,khvkhda0 c
where a.dhao00=b.dhao00 and a.khdm00=c.khdm00;
  已选择81583行。
  已用时间:  00: 00: 02.03
  Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=RULE
   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'XSTDDXX2'
   2    1     NESTED LOOPS
   3    2       NESTED LOOPS
   4    3         TABLE ACCESS (FULL) OF 'KHVKHDA0'
   5    3         TABLE ACCESS (BY INDEX ROWID) OF 'XSTDDXX1'
   6    5           INDEX (RANGE SCAN) OF 'XSTDDXX1_KHDM_INDEX' (NON-UNIQUE)
   7    2       INDEX (RANGE SCAN) OF 'XSTDDXX2_DH_JY_PK' (UNIQUE)
  Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
      57029  consistent gets
          0  physical reads
         68  redo size
    3621039  bytes sent via SQL*Net to client
      60321  bytes received via SQL*Net from client
       5440  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
      81583  rows processed
--以khvkhda0为驱动表,与xstddxx1做嵌套循环,产生的结果集于xstddxx2再做嵌套循环
  --****************************************************************语句2
--将khvkhda0从最后调到最前
select a.dhao00,a.khdm00,c.khmc00,a.ywrq00,b.jydm00,b.sl0000
from khvkhda0 c,xstddxx1 a,xstddxx2 b
where a.dhao00=b.dhao00 and a.khdm00=c.khdm00;
  已选择81583行。
  已用时间:  00: 00: 03.02
  Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=RULE
   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'KHVKHDA0'
   2    1     NESTED LOOPS
   3    2       NESTED LOOPS
   4    3         TABLE ACCESS (FULL) OF 'XSTDDXX2'
   5    3         TABLE ACCESS (BY INDEX ROWID) OF 'XSTDDXX1'
   6    5           INDEX (UNIQUE SCAN) OF 'XSTDDXX1_DHAO00_PK' (UNIQUE)
   7    2       INDEX (RANGE SCAN) OF 'KHVKHDA0_KHDM_INDEX' (NON-UNIQUE)
  Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
     279973  consistent gets
          0  physical reads
         68  redo size
    3713767  bytes sent via SQL*Net to client
      60321  bytes received via SQL*Net from client
       5440  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
      81583  rows processed
--以xstddxx2为驱动表,与xstddxx1做嵌套循环,产生的结果集与khvkhda0再做嵌套循环
  --***************************************************************************
--6、扩展理解:1、RBO下的多表连接,对于FROM子句,RBO以从右到左的顺序处理表连接
--***************************************************************************
  --***************************************************************************
--7、问题:1、RBO下,where子句中,条件的顺序对于执行计划有何影响
--***************************************************************************

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-251090-1-1.html 上篇帖子: RBO下,oracle如何选择驱动表 下篇帖子: 在Oracle 中处理日期大全
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表