Chinaunix首页 | 论坛 | 博客
  • 博客访问: 551023
  • 博文数量: 154
  • 博客积分: 4055
  • 博客等级: 上校
  • 技术积分: 1381
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-01 14:26
文章分类

全部博文(154)

文章存档

2014年(2)

2013年(2)

2011年(2)

2010年(11)

2009年(9)

2008年(35)

2007年(22)

2006年(71)

我的朋友

分类: Oracle

2007-01-05 09:17:48

昨天开发那边有说查询速度很慢,有一个sql现在效率很低,发过来的sql:
select lea.id lea_id,
       lea.leaid lea_leaid,
       lea.racctid lea_racctid,
       racctid_ref.acctid lea_racctid_ref,
       lea.leaname lea_leaname,
       lea.leatype lea_leatype,
       decode(lea.leatype,
              'leaguer_leaguertype_0',
              '公众会员',
              'leaguer_leaguertype_1',
              '商务会员',
              'leaguer_leaguertype_2',
              '特邀会员',
              '') lea_leatype_enum,
       lea.rvocationid lea_rvocationid,
       rvocationid_ref.vocationname lea_rvocationid_ref,
       lea.leatel lea_leatel,
       lea.ispart lea_ispart,
       lea.rownerid lea_rownerid,
       rownerid_ref.sname lea_rownerid_ref,
       lea.contname lea_contname,
       lea.conttel lea_conttel,
       lea.address lea_address
  from lea lea
  left join acct racctid_ref on racctid_ref.id = lea.racctid
  left join vocation rvocationid_ref on rvocationid_ref.id =
                                        lea.rvocationid
  left join org_employee rownerid_ref on rownerid_ref.id =
                                         lea.rownerid
 where 1 = 1
   and lea.istolea = 0
查询一次大约120S左右,acct表1000W,vocation 100左右,org_employee  3000左右,lea 8W左右的数据,acct id为主键,lea.racctid普通索引, lea.rvocationid 普通索引
后来发现执行计划使用了hash join链接,这的确很差的,后来修改了一次
select lea.id lea_id,
       lea.leaid lea_leaid,
       racctid_ref.acctid lea_racctid,
       lea.acctid lea_racctid_ref,
       lea.leaname lea_leaname,
       lea.leatype lea_leatype,
       decode(lea.leatype,
              'leaguer_leaguertype_0',
              '公众会员',
              'leaguer_leaguertype_1',
              '商务会员',
              'leaguer_leaguertype_2',
              '特邀会员',
              '') lea_leatype_enum,
       lea.rvocationid lea_rvocationid,
       rvocationid_ref.vocationname lea_rvocationid_ref,
       lea.leatel lea_leatel,
       lea.ispart lea_ispart,
       lea.rownerid lea_rownerid,
       rownerid_ref.sname lea_rownerid_ref,
       lea.contname lea_contname,
       lea.conttel lea_conttel,
       lea.address lea_address
  from lea lea
--  left join acct racctid_ref on racctid_ref.id = lea.racctid
  left join vocation rvocationid_ref on rvocationid_ref.id =
                                        lea.rvocationid
  left join org_employee rownerid_ref on rownerid_ref.id =
                                         lea.rownerid
 where 1 = 1
   and lea.istolea = 0
   and lea.racctid in
       (select id from acct where id = lea.racctid)
还是走hash join链接,后来在org_employee 上的id建立了一个索引,发现速度很快就上去了,0.7s左右就出来了,当然前边有个查询字段racctid_ref.acctid 如果改成lea.acctid  ,这时候,速度可以提高到0.015s,但是sql是自动生成的,如果修改的话整个系统都可能受到影响,硬编码绝对不是最好的方法,于是此时的速度已经可以的了,不错,速度终于恢复正常了,查找索引失效原因:
前阵子做过数据迁移,可能是迁移的过程中导致的索引失效,但是很多索引都是rebuild的,所以做迁移或move,rebuild的时候,千万要注意索引的问题
阅读(989) | 评论(1) | 转发(0) |
0

上一篇:一条sql的特殊功能

下一篇:Character set

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