专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > Oracle技术

SQL优化请问

发布时间:2010-05-20 14:01:29 文章来源:www.iduyao.cn 采编人员:星星草
SQL优化请教
各位:如下SQL,执行效率非常慢!基本上要十分钟。
select cinventoryid
  from ia_detailledger
 where dr = 0
   and pk_org = '1001N710000000008MPF'
   and cstockorgid = '0001N710000000001MSM'
   and cstordocid = '原料仓'
   and pk_group = '0001N7100000000004TG'
   and pk_book = '1001N710000000008KHK'
   and caccountperiod > = '2013-11'
   and caccountperiod < = '2014-09'
   and (csrcmodulecode in ('IC', 'PO', 'TO', 'SO') or
       csrcmodulecode = 'IA' and cbilltypecode = 'I6' and
       bwithdrawalflag = 'Y')
   and fintransitflag < > 1

执行计划如下:

该ia_detailledger表数据量较大:奖金700万行数据

该表现有索引如下:

请教各位该如何进行优化?
是否继续增加索引?已经更新过统计信息了

------解决思路----------------------
光这些没法优化。
你的数据特点是什么,可以考虑按照时间分区,
针对条件中重复度高的可以建位图索引,例如
cstordocid = '原料仓'满足这个数据多吗。要分析你数据的构造。
------解决思路----------------------
从上面的执行计划来看,查询使用了( pk_org,caccountperiod)的联合索引,但效率不高,因为匹配 pk_org = '1001N710000000008MPF' and and caccountperiod > = '2013-11'  and caccountperiod < = '2014-09' 的记录数很大。可以分析上面的查询条件中哪个或哪些匹配的记录数最少,然后创建相应的索引。
------解决思路----------------------
建议你这个只能建组合索引,单个索引效果不是很明显,
然后把过滤大的排在前面,如果不会组合索引,百度一下
http://blog.sina.com.cn/s/blog_5f597b690102v9tt.html
------解决思路----------------------
建议首先将用到复合索引的字段放到WHERE条件最后,SQL解析的方式是先从远离WHERE条件的字段先进行过滤。在就是少用IN和OR
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: