oracle - 升级到 18c 后查询运行缓慢
问题描述
我有一些查询在 12c 中运行了很长时间,但升级到 18c 后它们开始花费更多时间。12c 和 18c DB 的 DB 参数相同。我可以在 OEM 中看到的一件事是,估计行数和实际行数之间存在很大差异
我已经收集了使用表的统计信息,但问题仍然存在。
dbms_stats.gather_table_stats(ownname => USER, tabname => 'XYZ',
method_opt=> 'for all indexed columns size skewonly', granularity => 'ALL', degree => 8 ,
cascade => true,estimate_percent => 15);
两个数据库都在表中的相同数据上运行。
解决方案
在过去的好日子里,发明了一种高级调优方法,称为通过基数反馈进行调优——作者(Wolfgang Breitling)的主要思想是将优化器估计的基数(行数)与从优化器获得的实际行数进行比较。数据源。如果这些数字相等或相近,一切都很好,但很大的差异是麻烦的迹象。例如,对于估计计数 1,索引访问很好,但对于实际计数 1M,索引访问是灾难性的场景。
这种方法非常成功,以至于在 OEM 查询概述(您正在使用)中实现。
请参阅执行计划中的第 4 列和第 7 列:estimated rows
和actual rows
. 自下而上检查差异,从底部算起的第 3 行已经有 1 到 1M 的巨大差异 -这是你的第一个问题。
您必须检查此行的访问谓词 和过滤谓词,并调查为什么会产生这种基数不匹配(请参阅此处如何获取包含谓词信息的完整解释计划)。
在大多数情况下,原因是缺少或错误的优化器对象统计信息。
当然,可能是基数估计算法在升级中发生了变化,您必须调整统计数据,这在以前的版本中很好 - 让我们知道!
推荐阅读
- j - 如何否定 J lang 中的选择器?
- python - Django需要第一段
- javascript - 如何为这个可重用的 HTML 组件分离样式、HTML 和 JS?
- c# - 如何使用新的 ClosedXML.Excel.XLWorkbook(stream) 读取受密码保护的 Excel 文件
- java - 为单个字段展平 POJO
- r - 简单的 rvest 代码返回空字符
- c - 如何从 getopt 中获取参数以协同工作
- javascript - 选中复选框时如何更改复选框的字体真棒
- java - 如何从 url 字符串数组中删除包含特殊字符(如“#”)和文本块(如“.pdf”)的 url?
- javascript - 删除背景形状轮廓并创建列空间 (CSS)