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