性能调整

SQL语句主要的连接方法

a) Nested-loop join
适合于小表(几千至几万条)与大表做联接,在联接列上有索引。
分内表和外表(驱动表),靠近from子句的是内表。从效率上讲,小表应该作外表,大表应该作内表,即大表查询时走索引。

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

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表是否可以被Cache。Hash_area_size的大小将决定Hash Join的主要成本。可以看出Hash Join的成本和返回集合并没有直接的关系,所以当返回结果集比较大的时候一般具有较好的性能。
为了加快hash join的速度,可以调大hash_area_size和pga_aggregate_target(默认为25M)的值。

c) Sort Merge join
每一个Row Source在Join列上均排序。然后两个排序后的Row Source合并后,作一个结果集返回。Sort/Merge Join仅仅对equal Join有效。Sort的成本是Merge Join的主要构成部分。这样sort_area_size的大小将很大程度决定Merge Join的大小。同样如果A表或者B表已经经过排序的,那么Merge Join往往具有很好的性能。其不会走索引。没有驱动表的概念,即时响应能力较差。

Exists总比In快
有许多人认为用Exists总比用In要快,这也是一个误区。有时用in反而比用Exists快。
他们之间的区别如下:IN subquery,首先执行subquery,由subquery来驱动父查询。而Exists子查询则由父查询来驱动子查询。这就是两者之间的区别。所以如果子查询小的话,则可以采用in会快一些,如果子查询大的话,则采用exists会快一些。

索引是排好序的,在某些情况下可以使用索引来避免排序。 SELECT /*+ INDEX_ASC(acct acc_ndx1) */ acc_name,acc_surname FROM account acct;

大对象操作

a)Big Insert
(1)direct insert(serial and parallel)
insert /*+append*/into tab1 select * from tab2;
Insert /*+append parallel(emp,8)*/ into emp select * from emp_bak;
(2)nologging
insert into tab1 nologging select * from tab2;
(3)Large extent size
更大的extent可以获得更好的insert性能。
(4)Large rollback segment

b)Large Index Create
大的索引extent size值;大的Sort_area_size值
采用nologging
采用parallel
大的临时表空间

alter session sort_area_size=100000000;
create index xxx on aa(ab) nologging parallel 2;

posted @ 2007-10-22 09:31  dbblog  阅读(181)  评论(0)    收藏  举报