我们正在使用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将使用Prepared声明 - 正确吗?
2:我们可以从应用程序端做些什么 - 避免重新解析此查询?
3:我们可以在数据库服务器上做什么以避免重新解析?
答案 0 :(得分:0)
评论讨论解析资源(与执行时间/资源相反),但语句本身并不真正难以解析。最有趣的信息是执行计划。我假设查询总是相同的(但注释包含“可能”一词)。
关于问题1:
如果你想确保准备好的语句有帮助,你可以尝试在没有Hibernate的情况下运行相同的查询 - 只需简单的java.sql,PreparedStatement。
如果是这样,有一个Hibernate预处理语句缓存,但我从未使用它。
关于问题2:
如果这是您的热点,您可以将“direct SQL”与Hibernate一起使用(如果它和您的连接池允许缓存预准备语句),甚至不使用它:那么您就可以完全控制。
关于问题3:查看Oracle 11g结果缓存。