Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2775129
  • 博文数量: 389
  • 博客积分: 4177
  • 博客等级: 上校
  • 技术积分: 4773
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-16 23:29
文章分类

全部博文(389)

分类: Oracle

2009-12-07 12:02:27

                                 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优化非常重要,通过对连接的改写,在返回结果相同的情况下,性能已经大大的改善了。
阅读(1949) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~