dynamic_sampling 提示在 oracle 12c 中导致问题的查询

dynamic_sampling hint in queries causing issues in oracle 12c

dba 告诉我们,我们的应用程序导致服务器出现问题。 有如下开头的查询:

SELECT /* DS_SVC */ /*+ dynamic_sampling(0) no_sql_tune no_monitoring
optimizer_features_enable(default) no_parallel result_cache(snapshot=3600)
OPT_ESTIMATE(@"innerQuery", TABLE, "THIS_#21", SCALE_ROWS=0.0007347778778) 
*/ SUM(C1) FROM ...

他们使服务器崩溃,我们收到 ORA-12537。 我们正在使用 NHibernate,但我相当确定这些查询不是由我们的应用程序生成的。这些查询在业务逻辑中没有任何意义,它们是一些随机连接。我们没有 sql 跟踪权限,但在 dba 给我们的日志中,这些查询是在我们的模块名称下执行的。 我搜索了一下,发现 DS_SVC 是对 Oracle12 在动态采样中使用的一些服务查询的注释。

我们的查询并不十分复杂,有几个 rownum 限制为 1000 的左连接。

所以问题是 - 我可以说那些 DS_SVC 查询是 dba 方面的问题吗?如果是这样,我在哪里可以获得一些文档来证明这一点?

看起来像是 12c 的错误。看看改变这个是否有帮助。也可以咨询Oracle支持。

ALTER SESSION SET “_fix_control”=’7452863:0′

https://www.pythian.com/blog/performance-problems-with-dynamic-statistics-in-oracle-12c/

DYNAMIC_SAMPLING hint 用于让CBO​​收集 运行 时间内的基数。

Looks like algorithm has been changed in 12c and dynamic sampling is triggered in a broader set of use cases. This behavior can be disabled at statement, session or system level using the fix control for the bug 7452863. For example, ALTER SESSION SET “_fix_control”=’7452863:0′;

这些查询是由优化器本身生成的。该功能称为 "Dynamic sampling"。在 11g 之前,默认情况下仅在表上没有统计信息时使用。

从 12c 开始,动态采样也可以由其他新功能触发 "Adaptive execution plans"。例如,在列上缺少直方图的情况下。

通常这是 DBA 需要处理的相当复杂的事情。有多种方法可以修复 "Adaptive exec plans" 或禁用它们 partially/completely.

您最好联系 Oracle 支持。

我们在查询中添加了 /*+ dynamic_sampling(0) */ 提示。它有帮助,异常消失了。