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 12.2 或更高版本的PDB级别创建AWR报告