2013-01-08 88 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