SQL优化小技巧(一)
在SQL语句中,连接的代价非常高。为了减少连接带来的代价,我们需要尽可能的减少连接,如果在连接的不能避免的情况下尽量在连接之前进行过滤操作。
试验环境,oracle 10g+windows 2003,数据块大小8192BYTE。optimizer_mode设为all_rows。 发布以下语句创建表A,SQL>create table a as select * from v$process,创建表B,SQL>create table b as select * from v$session;
在日常的ORACLE维护中,经常需要找用户SYS的SPID号,用来确定trace文件的名字。所以我们的实验就以从两张表中选择用户SYS的SPID号作为例子,
1,以连接的方式来执行,然后跟踪SQL语句的执行计划。结果如下:
SQL> select a.spid,b.username
from a,b
where a.addr=b.paddr and b.username='SYS';
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=5 Card=1 Bytes=33)
1 0 HASH JOIN (Cost=5 Card=1 Bytes=33)
2 1 TABLE ACCESS (FULL) OF 'B' (TABLE) (Cost=2 Card=1 Bytes=
21)
3 1 TABLE ACCESS (FULL) OF 'A' (TABLE) (Cost=2 Card=28 Bytes
=336)
从这个结果可知两张表进行了hash join,代价为5,从两张表中得到的行为29行。
2,以子查询的方式来执行。结果如下:
SQL> select a.spid
from a
where a.addr like (select b.paddr from b where b.username='SYS');
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=4 Card=1 Bytes=12)
1 0 TABLE ACCESS (FULL) OF 'A' (TABLE) (Cost=2 Card=1 Bytes=12
)
2 1 TABLE ACCESS (FULL) OF 'B' (TABLE) (Cost=2 Card=1 Bytes=
21)
从结果看到没有进join操作,通过尽早的进行条件过滤,代价已为4,从两张表中共得到的行为2行;
由此看来,进行SQL优化非常重要,通过对连接的改写,在返回结果相同的情况下,性能已经大大的改善了。
阅读(1982) | 评论(0) | 转发(0) |