为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:8
【操作系统】:linux
【CPU】:
【问题描述】*:生产问题
select count(1) from A
WHERE DATA_TYPE = 1
and create_time >= '2024-04-18 00:00:00'
and create_time <= '2024-04-22 23:59:59' and (code in ( '2166' ) )
and app_id in ( '8746c42fe88c4d46bf08dd73bae3f271', '89d659cefadd4bcfad0b68a4ed428374', 'a6fb0a81d3a94cfa8f1381afbc5ae126', 'b4d6059e0bb548b0a4736d9ccb100945', 'e15c4e0cbd06467ebfd9d696ac6d9670' )
and state in ( 3 , 4 , 5 , 11 , 12 )
and ((first_audit = '301e24bcd6c243ed962eab1e4751d6d0'
and AUDIT_TYPE = '0')
or (AUDIT_TYPE = '1')
) and finished != 2
我有createtime索引,code索索引,他俩的联合索引。这个sql在客户端执行100ms,通过页面mybatis查询需要十几秒,我看了日志,sql就是我这个sql,我复制出来到客户端执行的很快,这是为什么求助!!!我这个平台同时可能会有几十个人访问这个sql,别的请求不慢比如说分页查询等等查询请求,但就这个count慢,但是客户端执行又非常快
估计是 绑定变量,发生类型转换了。
可以对比一下分页写法和count的执行计划是否一致
首先,要确认在客户端和应用程序执行的SQL是否完全一致!在客户端执行的这个SQL是否已经人为带入了变量值,而mybatis里的SQL是形如SELECT * FROM T WHERE C=?
,如果是这样,对于数据库这是完全不同的SQL!
其次,确认执行计划,如果是不完全相同SQL那执行计划大概率是不一样的。
最后,执行效率主要受执行计划影响,分析并调整执行计划。
更新下表的统计信息然后清空执行计划缓存
DBMS_STATS.GATHER_TABLE_STATS('模式名','表名',null,100,TRUE,'FOR ALL COLUMNS SIZE AUTO');
清除某条sql的执行计划缓存
select cache_item,sqlstr from V$CACHEPLN where sqlstr like '%select count(1) from A%';
获得cache_item值
CALL SP_CLEAR_PLAN_CACHE(cache_item);