現在 Java から一度に 1 項目ずつアクセスしている Oracle データベースに大規模なデータセットがあります。たとえば、ユーザーが 50 個のアイテムの一括取得を試みている場合、アイテムごとにストアド プロシージャを呼び出して、それらを順次処理します。現在、一括取得を実装しようとしていますが、ユーザーが範囲クエリを渡す方法が原因で、いくつかの問題が発生しています。
テーブルの例:
prim_key | identifier | start | end
----------+--------------+---------+-------
1 | aaa | 1 | 3
2 | aaa | 3 | 7
3 | bbb | 1 | 5
それが機能する方法は、次のようなクエリがある場合(id='aaa' and pos=1)
は見つかりますが、クエリprim_key = 1
を実行(id='aaa' and pos=2)
しても何も見つかりません。これを行うと、ストアド プロシージャが -2 をand と(id='aaa' and pos=-2)
同等の範囲スキャンに変換するため、再び prim_key=1 が検出されます。start<=2
end>2
(追加のコンテキスト: 開始/終了は実際には日付であり、このクエリ メカニズムにより、select prim_key のようなことを行うのではなく、効率的な「現在の日付の最新」クエリが可能になります。
start from myTable
where start = (select max(start) from myTable where start <= 2))
これはすべて問題なく、単一の取得では正しく機能しますが、バッチを大幅に高速化できるように、一括取得を試みています。最初の試みは、個々の呼び出しをマルチスレッド化することでしたが、同じテーブルに対して非常に多くの並列クエリを実行するため、データベースに過度のストレスがかかりました。これを解決するために、次のようなクエリを作成しようとしました
select prim_key
from myTable
where (identifier='aaa' and start=3)
or (identifier='aaa' and start<=2 and end>2)
入力パラメーターのリストからこれを構築します('aaa',3 ; 'bbb',-2)
。これはうまく機能し、私が期待するすべてのインデックスを使用して説明計画を作成します。
私の問題:さらに処理を行い、関連する prim_key を返すために、その行を取得した入力パラメーターが何であったかを知る必要があります。自分で定義できる疑似列のようなものを使用する必要があります。
select prim_key, PSUEDO
from myTable
where (identifier='aaa' and start=3 and PSUEDO='a3')
or (identifier='aaa' and start<=2 and end>2 and PSUEDO='a-2')
しかし、where 句から値を返す方法が見つかりません。サブクエリは、1 つの選択ですべてを実行することで得られるインデックス作成の効率を失うと思います。