我们使用hibernate命名查询,如下所示:
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将使用准备好的语句-对吗?
他说:我们可以从应用程序方面做更多的事情--避免重新解析这个查询?
他说:我们可以在数据库服务器上做些什么来避免重新解析?
发布于 2013-05-22 14:40:59
注释谈到了解析资源(与执行时间/资源相反),但是语句本身看起来并不难解析。最有趣的信息将是执行计划。我假设查询总是相同的(但注释中包含“可能”一词)。
关于问题1:
如果您想确保准备好的语句确实有帮助,可以尝试在没有Hibernate的情况下运行相同的查询--只是普通的java.sql、PreparedStatement。
如果是这样的话,就有一个Hibernate准备的语句缓存,但我从未使用过它。
关于问题2:
如果这是您的热点,您可以在Hibernate中使用“直接SQL”(如果它和您的连接池允许缓存准备好的语句),甚至没有它:那么您可以完全控制。
至于问题3:看看Oracle11g结果缓存。
https://stackoverflow.com/questions/16694065
复制相似问题