1

我们使用休眠命名查询如下:

named_query :   Select this_  from  TableA this_  where this_.id  in( select max(id) from TableA where COLA is null group by COLB ) and rownum=1  
Query query = getNamedQuery("nq.select.DirtySubject.onMaxDirtySubjectRecId");
List<SomeObject>  objectList       = query.list();

该查询已被 DBA 标记,评论逐字如下

这些表示每次执行时消耗最多解析资源的 SQL 语句。
此报告中出现的 SQL 语句可能正在重新分析。应该优化过度解析的 SQL 语句以降低其解析频率。这涉及使用绑定变量和相同的语句语法和大小写,以便能够重用 SQL 缓存中任何先前解析的语句。
检查这些查询以查看是否有任何 SQL 优化是可能的和合理的。

其他重要事实: 此查询是轮询逻辑的一部分,并被反复触发。
数据库:Oracle 11G
技术栈:Java、Hibernate、Tomcat、Linux、Oracle 11G

问题:
1:幕后 - Hibernate 将使用 Prepared 语句 - 正确吗?
2:我们可以从应用程序方面做更多的事情 - 以避免重新解析此查询?
3:我们可以在数据库服务器上做些什么来避免重新解析?

4

1 回答 1

0

评论谈到解析资源(与执行时间/资源相反),但语句本身看起来并不难解​​析。最有趣的信息是执行计划。我假设查询总是相同的(但评论包含“可能”这个词)。

至于问题1:

如果您想确保准备好的语句确实有帮助,您可以尝试在没有 Hibernate 的情况下运行相同的查询 - 只需简单的 java.sql、PreparedStatement。

如果是这样,则有一个 Hibernate 准备语句缓存,但我从未使用过它。

至于问题2:

如果这是您的热点,您可以在 Hibernate 中使用“直接 SQL”(如果它和您的连接池允许缓存准备好的语句),甚至不使用它:那么您就可以完全控制。

至于问题3:看看Oracle 11g 结果缓存。

于 2013-05-22T14:40:59.783 回答