4

我试图了解是什么导致了对 Oracle (10) 数据库的开放查询。

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

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

解析调用:15,000+

执行:0

SQL 文本:从 AVIEW 中选择 *

4

4 回答 4

1

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

于 2015-05-22T10:18:40.947 回答
0

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

于 2017-02-22T10:57:57.343 回答
0

Oracle 11、java、jdbc 11.2.0.3

当您像这样从插入中获取序列时会出现问题

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 解析器不缓存带有“*”的解析查询,因此每次插入都有额外的解析操作。

于 2017-02-22T06:46:54.293 回答
0

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

select col1, col2, col3 from table

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

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

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

调用了数据库以获取参数类型。

于 2019-06-24T09:12:09.157 回答