如何直接找到hibernate和运行sql之间的查询区别?

时间:2013-01-08 12:54:19

标签: java oracle hibernate time

我的查询如下:

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

当我从TOAD运行此查询时,需要接近100毫秒。当我使用

运行时
                   session
                .createSQLQuery(
                        "delete ....")
                .setParameter("...")
                .setParameter("...")
                .setParameter("...")
                .executeUpdate();

需要将近30分钟 真正的查询删除0行。所以可能存在一些hibernate / oracle问题。我怎么能找到它们? 感谢。

2 个答案:

答案 0 :(得分:6)

你可能在谈论hibernate.show_sql property from Hibernate configurations(ctrl + f代表“show_sql”)

将此属性设置为“true”会将使用过的SQL打印到标准输出

答案 1 :(得分:1)

在如此长的时间内,休眠可能产生的小开销不会被注意到。

您可以通过在fkdate列中添加索引来加快删除速度(在这种情况下,复合索引可能效果很好)。

<强>更新 我会详细说明,澄清为什么我建议这样做。 Hibernate必须为执行的查询解析映射(在select语句的情况下,它必须创建对象并用结果填充它们)。在这种情况下,看起来这个开销并不重要,因为我们谈论的是执行30分钟。

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

  • 如果从不同的机器执行TOAD和java进程,网络就会出现
  • JDBC和OCI之间的一些区别
  • 查询的错误翻译,可以使用show_sql属性进行检查。在这种情况下,通常映射有问题。

由于问题中没有任何删除,即使查询需要30分钟,这就是我建议索引的原因。确实可以减慢删除速度,但在这种情况下,不会删除任何行,因此执行子查询需要30分钟,而不是删除。

这个答案可能无法解决问题,但老实说,我认为它不应该是一个暗示。