各位:如下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