Neil的备忘录

just do it
posts - 66, comments - 8, trackbacks - 0, articles - 0

oracle 执行计划的一些概念

Posted on 2009-01-15 11:23 Neil's NoteBook 阅读(101) 评论(0)  编辑  收藏
Driving Table(驱动表):
    该表又称为外层表(OUTER TABLE)。这个概念用于嵌套与HASH连接中。如果该row source返回较多的行数据,则对所有的后续操作有负面影响。注意此处虽然翻译为驱动表,但实际上翻译为驱动行源(driving row source)更为确切。一般说来,是应用查询的限制条件后,返回较少行源的表作为驱动表,所以如果一个大表在WHERE条件有有限制条件(如等值限 制),则该大表作为驱动表也是合适的,所以并不是只有较小的表可以作为驱动表,正确说法应该为应用查询的限制条件后,返回较少行源的表作为驱动表。在执行 计划中,应该为靠上的那个row source

Probed Table(被探查表):
     该表又称为内层表(INNER TABLE)。在我们从驱动表中得到具体一行的数据后,在该表中寻找符合连接条件的行。所以该表应当为大表(实际上应该为返回较大row source的表)且相应的列上应该有索引。在我们后面的描述中,一般将该表称为连接操作的row source


组合索引(concatenated index):
      由多个列构成的索引,如create index idx_emp on emp(col1, col2, col3, ……),则我们称idx_emp索引为组合索引。在组合索引中有一个重要的概念:引导列(leading column),在上面的例子中,col1列为引导列。当我们进行查询时可以使用”where col1 = ? ”,也可以使用”where col1 = ? and col2 = ?”,这样的限制条件都会使用索引,但是”where col2 = ? ”查询就不会使用该索引。所以限制条件中包含先导列时,该限制条件才会使用该组合索引


Join表的几种方式:

1.(Sort Merge Join (SMJ) )
a.首先:生成驱动表的结果集。然后排序
  b.生成被探查表的结果集,然后排序。
  c.然后两个表进行连接。
2.(Nested Loops (NL) )
  两层循环,里边的表循环一次,然后去外边的表去查,得到结果行,然后放入结果集。
   所以较小的表要做为内层的表,即驱动表

  他还有另一个优点:可以返回已经连接的结果集,不必等到所有的结果集都返回,才返回结构。
  
3.(Hash Join)

   较小的表用来构建 row sourcehash 和 tablebitmap。
    外边的表是用来被hash的,并与第一个表生成的hashtable 进行连接。


索引扫描的方式:
索引唯一扫描(index unique scan)
select empno,ename from emp where empno=10;
   empno是主键或者是unique .
索引范围扫描(index range scan)
    empno>59
索引全扫描(index full scan)
   select empno, ename from big_emp order by empno,ename
是排着序的。
索引快速扫描(index fast full scan
    select empno,ename from big_emp;  不排序。

原文地址:http://weiruan85.javaeye.com/blog/288374

只有注册用户登录后才能发表评论。


网站导航: