暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle性能优化-SQL优化(案例四)

IT小Chen 2021-04-14
1207

Oracle性能优化-SQL优化(案例四)

 

环境:

DB:Oracle 11.2.0.1.0

问题:

ERP薪资发放节点计算时间耗时较长,需要15分钟左右;

问题原因:

有两个SQL执行特别慢

第一个查询WA_CACU_DATASQL,在plsql中执行特别快,返回0条,怀疑某些堆表被当成临时表使用,导致执行计划有问题,手动删除和锁定这些表的统计信息后查询SQL速度有明显提高;

第二个更新WA_CACU_DATASQL,第一次执行快,第二次执行慢,执行计划不稳定,禁用基数反馈(_optimizer_use_feedback)后速度正常;

解决过程:

问题重现时,查看主要慢在两个SQL,一个select wa_cacu_data ...,另一个update  ...;

耗时长的查询SQL如下

执行计划如下:

解决方案:

plsql中执行特别快,返回0条,怀疑某些堆表被当成临时表使用,导致执行计划有问题,手动删除和锁定这些表的统计信息后查询SQL速度有明显提高;

SQL> exec dbms_stats.delete_table_stats(cjc,tbm_period);

SQL> exec dbms_stats.delete_table_stats(cjc,org_adminorg);

SQL> exec dbms_stats.delete_table_stats(cjc,org_hrorg);

SQL> exec dbms_stats.lock_table_stats(cjc,tbm_period);

SQL> exec dbms_stats.lock_table_stats(cjc,org_adminorg);

SQL> exec dbms_stats.lock_table_stats(cjc,org_hrorg);

二:耗时长的update语句

抓取完整sql单独执行时,发现第一次执行很快,第二次执行特别慢,并且第一次和第二次生成的执行计划不一样,第二次执行计划带有“cardinality feedback used for this statement”,怀疑和oracle 11g 基数反馈特性有关,导致执行计划不稳定,SQL执行效率低。

解决方案:

session级别禁用基数反馈后,多次手动执行SQL,速度稳定变快了。

alter session set "_optimizer_use_feedback"=false;

临时解决办法可以考虑系统级别禁用基数反馈,或研发更改代码,在sql级别增加hint禁用基数反馈。

alter system set "_optimizer_use_feedback"=false;

/*+ opt_param('_optimizer_use_feedback' 'false') */

文章转载自IT小Chen,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论