我试图了解是什么导致了对 Oracle (10) 数据库的开放查询。
在 AWR 上,它显示了非常多的解析调用(例如 1 小时内超过 15,000 次),但执行次数为 0。
怎么查询不被执行,却被解析了15000次?
解析调用:15,000+
执行:0
SQL 文本:从 AVIEW 中选择 *
SQL 中的 * 将解释重复解析。您应该将其替换为字段名称列表。
零执行表示查询未在 AWR 快照内完成
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 解析器不缓存带有“*”的解析查询,因此每次插入都有额外的解析操作。
我们有类似的问题,但查询略有不同:
select col1, col2, col3 from table
结果是一样的。高解析率但零执行。
原因是来自 spring-jdbc 的 StatementCreatorUtils#setNull。版本 4.2.7 执行时:
insert into table (col1, col2, col3) values (val1, null, null)
调用了数据库以获取参数类型。