1,今天上午用户反馈系统缓慢,
查发现大量在执行同一条SQL语句。
2, 看执行计划,执行NEST LOOP嵌套循环 一个全表。
3, 初步怀疑是统计信息不对, 重新收集下统计信息。
执行计划还是有问题。
4,
查看慢的执行计划,
Note
-----
- dynamic sampling used for this statement (level=2)
- cardinality feedback used for this statement
查看正常的执行计划:
Note
-----
- dynamic sampling used for this statement (level=2)
5, 百度Cardinality Feedback :
Cardinality Feedback是11GR2出现的一个新特性,它的出现是为了帮助ORACLE优化器依据更精准的Cardinality 产生出更加优秀的执行计划。Cardinality基数的评估准确与否,对于优化器异常重要,直接影响到后续的JOIN COST等重要的成本计算评估,如果评估不当会造成CBO选择不当的执行计划。此技术对于仅执行一次SQL无效,在SQL第一次执行时,记录存储实际的Cardinality 和评估的Cardinality之间的差异,如果差异较大,在第二次执行时,优化器会依据实际的Cardinality 重新决策生成执行计划,但是需要注意的是,当使用更准确的Cardinality重新生成执行计划时,不一定生成的执行计划与第一次时不一样,完全有可能是相同的。 这个技术的出现是由于优化器在一些情况下不能很好的去计算Cardinality的数值,比如:统计信息缺失或陈旧、多谓词、直方图缺失或者缺少直方图等等,在这些情况下,Cardinality Feedback可能会帮上忙。
6, 问开发人员,自己了标量子查询,还是一个DB LINK远程表 :
SELECT
a.* ,
(select lookup_value_name
from f1.t1@DB1 V
where lookup_type_code = '111'
) AS LOAN_BANK
from table1 ;
7, 尝试 将f1.t1@DB1 改为本地表。
系统恢复正常。