Hibernate を使用して Oracle からデータを取得する必要がありますが、問題は、クエリに渡されるパラメーターの数が常に同じではないことです。
簡単にするために、次のクエリを考えてみましょう。
COL_1、COL_2、...、COL_N を TAB_1 から選択 (COL_1 は (?、?、... ?) 内)
in 句に渡されるパラメータの数は 1 ~ 500 です。数が 1 ~ 50 程度の場合は非常に高速に動作しますが、200 の場合はクエリの実行 (解析、説明計画の作成、クエリの実行) に数秒かかります。 . インデックスが作成され、使用されます - チェックされました。
クエリは動的に作成されるため、Hibernate Criteria API を使用します。最初のクエリ (パラメータが 100 個を超える場合) では 3 ~ 5 秒かかりますが、次のクエリでは (パラメータの数が異なる場合でも) より速く動作します。最初のクエリの応答時間を改善したいと考えています。その場合、Hibernate が必須であると仮定して何ができますか?
私はこの動的クエリを削除し、xml ファイルに名前付きクエリとしていくつかの静的クエリを作成します (その場合、これらのクエリは最初にプリコンパイルされます)。たとえば、
1) パラメーターの数が 50 未満の場合は 1 つのクエリ。
この場合、30 個のパラメーターがある場合、クエリは次のようになります。
TAB_1 から COL_1、COL_2、...、COL_N を選択します。COL_1 は (PAR_1、PAR_2、...、PAR_30、-1、-1、...、-1 ?) にあります。
2) 数が 50 から 100 の間の場合は 2 つ目など。
問題は、名前付きクエリと HQL を使用するのはそれほど単純ではないことです (JDBC では簡単です)。HQL では、リストのみを渡し、そのリストでパラメーターの数を指定しません。つまり、実際にはクエリは 1 つだけです。
'from Person where id in (:person_list)'
myQuery.setParameterList("person_list", myList)
それを解決するオプションはありますか?
ちなみに、新しいクエリごとに説明プランが実行されると思ったので、たとえば:
(a) select COL_1, COL_2, ..., COL_N from TAB_1 where COL_1 in (?, ?, ..., ?) <100> - 説明計画を作成する必要があります
(b) select COL_1, COL_2, ..., COL_N from TAB_1 where COL_1 in (?, ?, ..., ?) <100> - EXPLAIN PLAN はすでにキャッシュに存在するため作成されません
(c) select COL_1, COL_2, ..., COL_N from TAB_1 where COL_1 in (?, ?, ..., ?) <120> - 説明プランを作成する必要があります (120 個のパラメーターを持つクエリの説明プランはありません) )しかし、(a)に比べて時間がかからず、(b)とほぼ同じなので、同様のクエリが以前に実行された場合、おそらくOracleはこのプランをより速く作成できます
その理由は何ですか?