20200218-Oracle将普通表当临时表使用 和 基数反馈导致的性能问题

在这里插入图片描述

环境:

DB:Oracle 11.2.0.1.0

问题:

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

问题原因:

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

第二个更新WA_CACU_DATA 的 SQL ,第一次执行快,第二次执行慢,执行计划不稳定,禁用基数反馈 (_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;

欢迎关注我的公众号:IT小Chen

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值