ITPub博客

首页 > Linux操作系统 > Linux操作系统 > SQL语句主要的连接方法

SQL语句主要的连接方法

原创 Linux操作系统 作者:arthurshen_bleum 时间:2009-02-27 09:21:18 0 删除 编辑
a) Nested-loop join
适合于小表(几千条,几万条记录)与大表做联接

在联接列上有索引。


分内表和外表(驱动表),靠近from子句的是内表。从效率上讲,小表应该作外表,大表应该作内表,即大表查询时走索引。


COST= Access cost of A(
驱动表
) + (access cost of B * number of rows from A)

成本计算方法:

设小表100行,大表100000行。


两表均有索引:

如果小表在内,大表在外(驱动表)的话,则扫描次数为:

100000+100000*2 (
其中2表示IO次数,一次索引,一次数据
)
如果大表在内,小表在外(驱动表)的话,则扫描次数为:

100+100*2.

两表均无索引:

如果小表在内,大表在外的话,则扫描次数为:

100000+100*100000
如果大表在内,小表在外的话,则扫描次数为:

100+100000*100

注意:如果一个表有索引,一个表没有索引,ORACLE会将没有索引的表作驱动表。如果两个表都有索引,则外表作驱动表。如果两个都没索引的话,则也是外表作驱动表。


基本的执行计划如下所示:

NESTED LOOPS
TABLE ACCESS (BY ROWID) OF our_outer_table
INDEX (..SCAN) OF outer_table_index(….)
TABLE ACCESS (BY ROWID) OF our_inner_table
INDEX (..SCAN) OF inner_table_index(….)

b) Hash join

适合于大表与大表,小表(几十万,几百万)与大表之间的联连。

联接列上不需要索引。


基本执行计划如下:

HASH JOIN
TABLE ACCESS (….) OF tableA
TABLE ACCESS (….) OF tableB

cost= (access cost of A * number of hash partitions of B) + access cost of B

可以看出主要成本在于A表是否可以被CacheHash_area_size的大小将决定Hash Join的主要成本。可以看出Hash Join的成本和返回集合并没有直接的关系,所以当返回结果集比较大的时候一般具有较好的性能。


为了加快hash join的速度,可以调大hash_area_sizepga_aggregate_target(默认为25M)的值。



c) Sort Merge join

每一个Row SourceJoin列上均排序。

然后两个排序后的Row Source合并后,作一个结果集返回。

Sort/Merge Join
仅仅对equal Join有效。


基本执行计划

MERGE (JOIN)
SORT (JOIN)
TABLE ACCESS (….) OF tableA
SORT (JOIN)
TABLE ACCESS (….) OF tableB

cost= access cost of A + access cost of B +(sort cost of A + sort cost of B)

可以看出Sort的成本是Merge Join的主要构成部分。这样sort_area_size的大小将很大程度决定Merge Join的大小。同样如果A表或者B表已经经过排序的,那么Merge Join往往具有很好的性能。其不会走索引。


没有驱动表的概念,即时响应能力较差。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/20945761/viewspace-558012/,如需转载,请注明出处,否则将追究法律责任。

上一篇: statspack report分析
请登录后发表评论 登录
全部评论

注册时间:2009-02-26

  • 博文量
    36
  • 访问量
    27073