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 行が削除されます。したがって、いくつかの休止状態/オラクルの問題がある可能性があります。どうすればそれらを見つけることができますか? ありがとう。

4

2 に答える 2

6

おそらく、Hibernate構成のhibernate.show_sqlプロパティについて話しているでしょう(「show_sql」の場合はctrl + f)

このプロパティを「true」に設定すると、使用されているSQLが標準出力に出力されます

于 2013-01-08T12:59:21.370 に答える
1

このような長い時間の場合、休止状態が生成する可能性のある小さなオーバーヘッドは気付かれません。

fkおよび列にインデックスを追加することで、おそらく削除を高速化できdateます (この場合、複合インデックスがうまく機能する可能性があります)。

更新 これを提案する理由を明確にするために、少し詳しく説明します。Hibernate は、実行されたクエリのマッピングを解決する必要があります (select ステートメントの場合は、オブジェクトを作成し、それらに結果を入力する必要があります)。この場合、30 分間の実行について話しているため、このオーバーヘッドは重要ではないようです。

したがって、問題はおそらく次のような別の場所にあります。

  • TOAD と Java プロセスを異なるマシンから実行する場合のネットワークの問題
  • JDBCとOCIの違い
  • show_sql プロパティで確認できるクエリの不適切な翻訳。この場合、通常、マッピングに何か問題があります。

質問に記載されているように削除が行われておらず、それでもクエリに 30 分かかるため、インデックスを提案したのはそのためです。削除が遅くなる可能性があることは事実ですが、この場合も行が削除されないため、削除を行わずにサブクエリを実行するのに 30 分かかります。

この回答は問題を解決しないかもしれませんが、正直なところ、反対票を投じるに値するとは思いません。

于 2013-01-08T13:05:48.933 に答える