Chinaunix首页 | 论坛 | 博客
  • 博客访问: 287903
  • 博文数量: 60
  • 博客积分: 1437
  • 博客等级: 中尉
  • 技术积分: 632
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-10 14:12
文章存档

2012年(7)

2011年(53)

分类: Oracle

2012-11-21 13:24:13

上周给客户远程解决了个SQL性能问题,一个SQL在测试环境需要7分钟、在正式环境需要15分钟:

点击(此处)折叠或打开

  1. select t1.f_entefsguid, t1.username, t1.f_bitycode, t1.billno ,to_char(MAX(pj.operationdate),'yyyy-mm-dd') as rq
  2. from xxx.pj_billcheck t1, xxx.pj_businessmain pj, xxx.pj_businessdetail pjd
  3. where pj.guid = pjd.f_bumaguid
  4. and pj.f_butyguid ='pjcs'
  5. and pjd.f_bitycode = t1.f_bitycode
  6. and pjd.startno <= t1.billno
  7. and pjd.endno >= t1.billno
  8. and t1.f_entefsguid = '3309031239'
  9. and t1.checksign='0'
  10. group by t1.f_entefsguid, t1.username, t1.f_bitycode, t1.billno
  11. order by f_entefsguid,username,f_bitycode,rq,billno

  12. 46596 rows selected.
  13. Elapsed: 00:15:34.68

  14. Execution Plan
  15. ----------------------------------------------------------
  16.    0 SELECT STATEMENT Optimizer=CHOOSE (Cost=101 Card=1079 Bytes=85241)
  17.    1 0 SORT (ORDER BY) (Cost=101 Card=1079 Bytes=85241)
  18.    2 1 SORT (GROUP BY) (Cost=101 Card=1079 Bytes=85241)
  19.    3 2 HASH JOIN (Cost=60 Card=1079 Bytes=85241)
  20.    4 3 TABLE ACCESS (FULL) OF 'PJ_BUSINESSMAIN' (Cost=25 Card=1627 Bytes=34167)
  21.    5 3 HASH JOIN (Cost=34 Card=2288 Bytes=132704)
  22.    6 5 TABLE ACCESS (BY INDEX ROWID) OF 'PJ_BILLCHECK' (Cost=14 Card=552 Bytes=14352)
  23.    7 6 INDEX (RANGE SCAN) OF 'IDX_BILLCHECK2' (NON-UNIQUE) (Cost=1 Card=1104)
  24.    8 5 TABLE ACCESS (FULL) OF 'PJ_BUSINESSDETAIL' (Cost=19 Card=16570 Bytes=530240)

测试环境:

点击(此处)折叠或打开

  1. 已选择46596行。

  2. 已用时间: 00: 06: 56.09

  3. Execution Plan
  4. ----------------------------------------------------------
  5.    0 SELECT STATEMENT Optimizer=CHOOSE (Cost=90 Card=1079 Bytes=85241)
  6.    1 0 SORT (ORDER BY) (Cost=90 Card=1079 Bytes=85241)
  7.    2 1 SORT (GROUP BY) (Cost=90 Card=1079 Bytes=85241)
  8.    3 2 HASH JOIN (Cost=60 Card=1079 Bytes=85241)
  9.    4 3 TABLE ACCESS (FULL) OF 'PJ_BUSINESSMAIN' (Cost=25 Card=1627 Bytes=34167)
  10.    5 3 HASH JOIN (Cost=34 Card=2288 Bytes=132704)
  11.    6 5 TABLE ACCESS (BY INDEX ROWID) OF 'PJ_BILLCHECK' (Cost=14 Card=552 Bytes=14352)
  12.    7 6 INDEX (RANGE SCAN) OF 'IDX_BILLCHECK2' (NON-UNIQUE) (Cost=1 Card=1104)
  13.    8 5 TABLE ACCESS (FULL) OF 'PJ_BUSINESSDETAIL' (Cost=19 Card=16570 Bytes=530240)

  14. Statistics
  15. ----------------------------------------------------------
  16.           0 recursive calls
  17.           0 db block gets
  18.        2707 consistent gets
  19.         821 physical reads
  20.           0 redo size
  21.     1308448 bytes sent via SQL*Net to client
  22.       34669 bytes received via SQL*Net from client
  23.        3108 SQL*Net roundtrips to/from client
  24.           2 sorts (memory)
  25.           0 sorts (disk)
  26.       46596 rows processed
对比发现执行计划没有什么变化,优化SQL的时候,我基本上是从查看统计信息开始,检查了一下统计信息,发现这个用户下的对象都没有统计信息,因为客户的系统运行了一段时间了,为了减少对系统的影响,我只对这个SQL涉及到的对象做了统计信息收集:

点击(此处)折叠或打开

  1. analyze table xxxx.pj_billcheck compute statistics for table for all indexes for all indexed columns;

  2. analyze table xxx.pj_businessmain compute statistics for table for all indexes for all indexed columns;

  3. analyze table xxx.pj_businessdetail compute statistics for table for all indexes for all indexed columns;
收集统计信息后运行SQL,只需要12秒就运行完了,客户能接受这个结果,优化结束。
Tips:优化是无止境的,当达到客户的要求(签合同了就叫做SLA)就立即停止,因为往后的代价成指数增长,性能收益呈指数下降!
   这个SQL的优化很简单,就做了相关对象上的统计信息收集,性能就提高了75倍,有统计信息就万事大吉了吗?还是这个客户,过来两天又找到我,这次有点不同了,如何优化,且听下回分解:)



阅读(2708) | 评论(0) | 转发(0) |
0

上一篇:测试页面

下一篇:SQL优化点滴之SQL改写

给主人留下些什么吧!~~