1

我有这样的查询:

 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 行。所以可能存在一些休眠/oracle问题。我怎样才能找到它们?谢谢。

4

2 回答 2

6

您可能正在谈论Hibernate 配置中的 hibernate.show_sql 属性(ctrl+f for "show_sql")

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

于 2013-01-08T12:59:21.370 回答
1

在这么长时间的情况下,hibernate可能产生的小开销是不会被注意到的。

fk您可以通过在和列中添加索引来加快删除速度date(在这种情况下,复合索引可能会很好地工作)。

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

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

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

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

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

于 2013-01-08T13:05:48.933 回答