为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:8
【操作系统】:Linux
【CPU】:
【问题描述】:
如下sql:
1:SELECT ZJZT, COUNT() TOTAL FROM ZJ_ZJB Z WHERE Z.ZJHM >= 'EA1000010000' AND Z.ZJHM <= 'EA1000020000' GROUP BY Z.ZJZT
2:SELECT ZJZT, COUNT(*) TOTAL FROM ZJ_ZJB Z WHERE Z.ZJHM >= 'EA1000010000' AND Z.ZJHM <= 'EA1000020000' AND SYDW = '123456' GROUP BY Z.ZJZT
表数据三千万+
ZJHM 和 SYDW 列都是索引列,SQL2的查询时间是SQL1的200+倍数
索引列和执行计划看看
索引的自动优化就很差劲,有索引字段A、B、C,然后查询sql1:select * from tab_ where A>= ? and A<= ? and B=?;
sql2:select * from tab_ where A is null and B=? and C>=? and C<= ?;
sql1 零点几秒返回结果,sql2 几十秒,
explain发现都是先走的索引A、索引B,然后删除A字段条件,则先走索引B字段,最后走C字段索引,
实际强制走索引C sql2也是零点几秒返回结果,针对sql2数据库不能自动优化到先走索引C,这就导致了多条件比少条件的查询还慢。
使用 from tab_ INDEX tab_xx_idx 强制走索引,在数据库工具执行没问题,但是mybatis不认INDEX tab_xx_idx ,会报错,使用了/*+ INDEX(tab_ tab_xx_idx) */提示语,实际执行又不会使用提示语,还是走原来的索引
我怀疑它选错索引了。你可以看下执行计划。
你如果收下统计信息,没准就好了。
DBMS_STATS.GATHER_TABLE_STATS('','',NULL,100,TRUE,'FOR ALL COLUMNS SIZE AUTO');
使用这个语句收集下表的统计信息然后再试试吧。
第二个SQL需要创建联合索引, create index IDX_ZJB_HM_DW ON ZJ_ZJB(ZJHM,SYDW);