我的查询如下:
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问题。我怎么能找到它们? 感谢。
答案 0 :(得分:6)
你可能在谈论hibernate.show_sql property from Hibernate configurations(ctrl + f代表“show_sql”)
将此属性设置为“true”会将使用过的SQL打印到标准输出
答案 1 :(得分:1)
在如此长的时间内,休眠可能产生的小开销不会被注意到。
您可以通过在fk
和date
列中添加索引来加快删除速度(在这种情况下,复合索引可能效果很好)。
<强>更新强> 我会详细说明,澄清为什么我建议这样做。 Hibernate必须为执行的查询解析映射(在select语句的情况下,它必须创建对象并用结果填充它们)。在这种情况下,看起来这个开销并不重要,因为我们谈论的是执行30分钟。
所以问题可能在于其他地方:
由于问题中没有任何删除,即使查询需要30分钟,这就是我建议索引的原因。确实可以减慢删除速度,但在这种情况下,不会删除任何行,因此执行子查询需要30分钟,而不是删除。
这个答案可能无法解决问题,但老实说,我认为它不应该是一个暗示。