首页 > 解决方案 > 升级到 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);

两个数据库都在表中的相同数据上运行。

标签: oracle

解决方案


在过去的好日子里,发明了一种高级调优方法,称为通过基数反馈进行调优——作者(Wolfgang Breitling)的主要思想是将优化器估计的基数(行数)与从优化器获得的实际行数进行比较。数据源。如果这些数字相等或相近,一切都很好,但很大的差异是麻烦的迹象。例如,对于估计计数 1,索引访问很好,但对于实际计数 1M,索引访问是灾难性的场景。

这种方法非常成功,以至于在 OEM 查询概述(您正在使用)中实现。

请参阅执行计划中的第 4 列和第 7 列:estimated rowsactual rows. 自下而上检查差异,从底部算起的第 3 行已经有 1 到 1M 的巨大差异 -这是你的第一个问题

您必须检查此行的访问谓词 和过滤谓词,并调查为什么会产生这种基数不匹配(请参阅此处如何获取包含谓词信息的完整解释计划)。

在大多数情况下,原因是缺少或错误的优化器对象统计信息。

当然,可能是基数估计算法在升级中发生了变化,您必须调整统计数据,这在以前的版本中很好 - 让我们知道!


推荐阅读