2013-01-08 49 views
1

我有查询,如:如何直接查询hibernate和运行sql之间的查询差异?

delete from tableA where fk in (select id from tableA where fk='somevalue' 
and tableA.date between date1 and date2) 

当我蟾蜍运行此查询所花费近100毫秒。当我运行使用

    session 
       .createSQLQuery(
         "delete ....") 
       .setParameter("...") 
       .setParameter("...") 
       .setParameter("...") 
       .executeUpdate(); 

需要将近30分钟 真的查询删除0行。所以可能会有一些hibernate/oracle的问题。我如何找到它们? 谢谢。

+0

不明白。请详细说明。子查询需要标准 - 哪些行应该被删除。它会产生问题吗? – user710818

+0

我建议启用Hibernate的查询日志,如[这里](http://www.javalobby.org/java/forums/t44119.html)或[here](http://blog.aplikacja.info/2010/03/how-to-debug-hibernate-sql-queries-with-parameters /),因为在运行本机查询时不应该有这样的区别。 – fvu

+0

通过show sql属性获取SQL并在其上运行解释计划。这会给优化提供一些线索。顺便说一句,上面的查询看起来很奇怪,你不需要“IN”子句...猜测那是因为你简化了插图... – aishwarya

回答

1

在这样的情况下很长一段时间,休眠可能产生的小开销不会被注意到。

您可以通过在fkdate列中添加索引来加速删除(在这种情况下复合一个可能会很好)。

UPDATE 我会详细说明一下,澄清为什么我建议这样做。 Hibernate将必须解析所执行的查询的映射(并且在选择语句的情况下,它将不得不创建对象并用结果填充它们)。在这种情况下,看起来这种开销并不重要,因为我们正在谈论30分钟的执行。

所以问题,可能在于其他地方,如:

  • 网络的所有主题,如果执行蟾蜍,并从不同的机器
  • JDBC和OCI
  • 之间的一些差异查询的翻译不好的java程序,可以使用show_sql属性进行检查。在这种情况下,通常是映射有问题。

由于问题中没有删除任何内容,甚至查询需要30分钟,这就是为什么我建议索引。确实,它可能会减慢删除速度,但在这种情况下,没有行被删除,因此需要30分钟来执行子查询,而不是执行任何删除操作。

这个答案可能无法解决问题,但我真的不认为它应该得到一个downvote。

+0

正如问题中所解释的,当在工具中执行时,他的查询已经非常快。而且添加索引可能会减慢删除,因为它们也必须在删除时更新。 – fvu

+0

但是这个问题可能不会休眠,因为它与这个查询很少有关系。也许那么jdbc和OCI之间的区别,如果从不同的盒子执行网络问题......我想说的是,休眠可能不是原因。 – richardtz

+0

我同意你的评论,downvote不是我的 – fvu