设为首页 加入收藏

TOP

Oracle执行计划详解(四)
2015-07-24 10:29:53 来源: 作者: 【 】 浏览:4
Tags:Oracle 执行 计划 详解
接方法没有的的一个优点是:可以先返回已经连接的行,而不必等待所有的连接操作处理完才返回数据,这可以实现快速的响应时间。
  如果不使用并行操作,最好的驱动表是那些应用了where 限制条件后,可以返回较少行数据的的表,所以大表也可能称为驱动表,关键看限制条件。对于并行查询,我们经常选择大表作为驱动表,因为大表可以充分利用并 行功能。当然,有时对查询使用并行操作并不一定会比查询不使用并行操作效率高,因为最后可能每个表只有很少的行符合限制条件,而且还要看你的硬件配置是否 可以支持并行(如是否有多个CPU,多个硬盘控制器),所以要具体问题具体对待。
  NL连接的例子:
  SQL> explain plan for
  select a.dname,b.sql
  from dept a,emp b
  where a.deptno = b.deptno;
  Query Plan
  -------------------------
  SELECT STATEMENT [CHOOSE] Cost=5
  NESTED LOOPS
  TABLE ACCESS FULL DEPT [ANALYZED]
  TABLE ACCESS FULL EMP [ANALYZED]

   3,哈希连接(Hash Join, HJ)
  这种连接是在oracle 7.3以后引入的,从理论上来说比NL与SMJ更高效,而且只用在CBO优化器中。
  较小的row source被用来构建hash table与bitmap,第2个row source被用来被hansed,并与第一个row source生成的hash table进行匹配,以便进行进一步的连接。Bitmap被用来作为一种比较快的查找方法,来检查在hash table中是否有匹配的行。特别的,当hash table比较大而不能全部容纳在内存中时,这种查找方法更为有用。这种连接方法也有NL连接中所谓的驱动表的概念,被构建为hash table与bitmap的表为驱动表,当被构建的hash table与bitmap能被容纳在内存中时,这种连接方式的效率极高。

  HASH连接的例子:
  SQL> explain plan for
  select /*+ use_hash(emp) */ empno
  from emp, dept
  where emp.deptno = dept.deptno;
  Query Plan
  ----------------------------
  SELECT STATEMENT[CHOOSE] Cost=3
  HASH JOIN
  TABLE ACCESS FULL DEPT
  TABLE ACCESS FULL EMP

  要使哈希连接有效,需要设置HASH_JOIN_ENABLED=TRUE,缺省情况下该参数为TRUE,另外,不要忘了还要设置 hash_area_size参数,以使哈希连接高效运行,因为哈希连接会在该参数指定大小的内存中运行,过小的参数会使哈希连接的性能比其他连接方式还 要低。
   另外,笛卡儿乘积(Cartesian Product)
  当两个row source做连接,但是它们之间没有关联条件时,就会在两个row source中做笛卡儿乘积,这通常由编写代码疏漏造成(即程序员忘了写关联条件)。笛卡尔乘积是一个表的每一行依次与另一个表中的所有行匹配。在特殊情况下我们可以使用笛卡儿乘积,如在星形连接中,除此之外,我们要尽量不使用笛卡儿乘积,否则,自己想结果是什么吧!
  注意在下面的语句中,在2个表之间没有连接。
  SQL> explain plan for
  select emp.deptno,dept,deptno
  from emp,dept
  Query Plan
  ------------------------
  SLECT STATEMENT [CHOOSE] Cost=5
  MERGE JOIN CARTESIAN
  TABLE ACCESS FULL DEPT
  SORT JOIN
  TABLE ACCESS FULL EMP

  CARTESIAN关键字指出了在2个表之间做笛卡尔乘积。假如表emp有n行,dept表有m行,笛卡尔乘积的结果就是得到n * m行结果。
   最后,总结一下,在哪种情况下用哪种连接方法比较好:

   排序 - - 合并连接(Sort Merge Join, SMJ):
  a) 对于非等值连接,这种连接方式的效率是比较高的。
  b) 如果在关联的列上都有索引,效果更好。
  c) 对于将2个较大的row source做连接,该连接方法比NL连接要好一些。
  d) 但是如果sort merge返回的row source过大,则又会导致使用过多的rowid在表中查询数据时,数据库性能下降,因为过多的I/O.

   嵌套循环(Nested Loops, NL):
  a) 如果driving row source(外部表)比较小,并且在inner row source(内部表)上有唯一索引,或有高选择性非唯一索引时,使用这种方法可以得到较好的效率。
  b) NESTED LOOPS有其它连接方法没有的的一个优点是:可以先返回已经连接的行,而不必等待所有的连接操作处理完才返回数据,这可以实现快速的响应时间。

   哈希连接(Hash Join, HJ):
  a) 这种方法是在oracle7后来引入的,使用了比较先进的连接理论,一般来说,其效率应该好于其它2种连接,但是这种连接只能用在CBO优化器中,而且需要设置合适的hash_area_size参数,才能取得较好的性能。
  b) 在2个较大的row source之间连接时会取得相对较好的效率,在一个row source较小时则能取得更好的效率。
  c) 只能用于等值连接中


  +++
   Oracle执行计划的概述
  ---

   Oracle执行计划的相关概念:
   Rowid:系统给oracle数据的每行附加的一个伪列,包含数据表名称,数据库id,存储数据库id以及一个流水号等信息,rowid在行的生命周期内唯一。
   Recursive sql:为了执行用户语句,系统附加执行的额外操作语句,譬如对数据字典的维护等。
   Row source(行源):oracle执行步骤过程中,由上一个操作返回的符合条件的行的集合。
   Predicate(谓词):where后的限制条件。
   Driving table(驱动表):又称为连接的外层表,主要用于嵌套与hash连接中。一般来说是将应用限制条件后,返回较少行源的表作为驱动表。在后面的描述中,将driving table称为连接操作的row source 1。
   Probed table(被探查表):连接的内层表,在我们从driving table得到具体的一行数据后,在probed table中寻找符合条件的行,所以该表应该为较大的row source,并且对应连接条件的列上应该有索引。在后面的描述中,一般将该表称为连接操作的row source 2.
   Concatenated index(组合索引):一个索引如果由多列构成,那么就称为组合索引,组合索引的第一列为引导列,只有谓词中包含引导列时,索引才可用。
  可选择性:表中某列的不同数值数量/表的总行数如果接近于1,则列的可选择性为高。
   Oracle访问数据的存取方法:
   Full table scans, FTS(全表扫描):通过设置db_block_multiblock_read_count可以设置一次IO能读取的数
首页 上一页 1 2 3 4 5 下一页 尾页 4/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇锁(上) 下一篇oracle错误ORA-01950对表空间&quo..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C语言中,“指针”用 (2025-12-26 15:20:18)
·在c语言的指针运算中 (2025-12-26 15:20:15)
·C语言-函数指针与函 (2025-12-26 15:20:12)
·求navicat for mysql (2025-12-26 13:21:33)
·有哪位大哥推荐一下m (2025-12-26 13:21:30)