Oracle AWR - 高 SQL 解析调用但 0 次执行

Posted

技术标签:

【中文标题】Oracle AWR - 高 SQL 解析调用但 0 次执行【英文标题】:Oracle AWR - high SQL Parse Calls but 0 Executions 【发布时间】:2015-05-22 10:15:56 【问题描述】:

我正在尝试了解导致 Oracle (10) 数据库上的开放查询的原因。

在 AWR 上,它显示了非常多的解析调用(例如,1 小时内超过 15,000 次),但执行次数为 0。

怎么查询不执行,却解析了15000次?

解析调用:15,000+

执行次数:0

SQL 文本:从 AVIEW 中选择 *

【问题讨论】:

您是否尝试过运行查询?可能会引发异常,比如说not a group by expresion,所以它不算作执行... 【参考方案1】:

SQL 中的 * 将解释重复解析。您应该将其替换为字段名称列表。

【讨论】:

目前,我无法找到/跟踪此查询的来源——因此无法修改!这与 0 次处决有何关系?是否有一个调用会产生许多解析,还是有多个调用每个都会导致解析? 你可能会发现Oracle引擎在后台不断的解析SQL语句。你的从来没有被完全解释过,所以它被一遍又一遍地解析,即使没有人使用它。很可能有人只是动态地敲击查询,以快速查看表内容。这样的事情是必然会发生的。我会忽略它。 注意到在我们的 prod 环境中的相同解析以及几个表。试图收集更多细节,如果我得到一些线索会在这里更新......【参考方案2】:

Oracle 11、java、jdbc 11.2.0.3

当你像这样getting sequence from insert 时出现问题

PreparedStatement ps = connection.prepareStatement(QUERY, new String[]  "student_id" );

我们发现 jdbc 驱动程序在每次插入之前都会准备“SELECT * FROM”语句。只有解析操作没有执行。

T4CConnection.doDescribeTable

T4CStatement localT4CStatement = new T4CStatement(this, -1, -1);
localT4CStatement.open();
String str1 = paramAutoKeyInfo.getTableName();
String str2 = new StringBuilder().append("SELECT * FROM ").append(str1).toString();
localT4CStatement.sqlObject.initialize(str2);

Oracle 解析器不缓存带有“*”的已解析查询,因此每次插入都有额外的解析操作。

【讨论】:

【参考方案3】:

零执行表示查询未在 AWR 快照内完成

【讨论】:

【参考方案4】:

我们有类似的问题,但查询略有不同:

select col1, col2, col3 from table

结果是一样的。高解析率但零执行。

原因是来自 spring-jdbc 的 StatementCreatorUtils#setNull。 4.2.7 版 执行时:

insert into table (col1, col2, col3) values (val1, null, null)

有一个参数类型的数据库调用。

【讨论】:

以上是关于Oracle AWR - 高 SQL 解析调用但 0 次执行的主要内容,如果未能解决你的问题,请参考以下文章

性能测试案例:Oracle重复的SQL

Oracle 12.2 或更高版本的PDB级别创建AWR报告

Oracle之AWR报告解析

Oracle-AWR报告简介及如何生成

Oracle 11g AWR 系列五:如何生成 AWR 报告?

记录一次Oracle 'Execute to parse'问题解决