アイテムのコレクション (> 100 万) と、それを処理するいくつかの処理を行うシステムがあります。各プロセッサは各項目を 1 回だけ処理する必要があり、プロセッサには階層があります。
私たちの現在の実装は、各プロセッサがすでに行ったことを追跡する「処理済み」テーブルを持つことです。
CREATE TABLE items (id NUMBER PRIMARY KEY, ...)
CREATE TABLE itemsProcessed(
item NUMBER REFERENCES items(id),
processor NUMBER)
私たちのクエリはこれです (itemsProcessed
関連するインデックスがあります) - NOT IN を使用して、現在のプロセッサまたはその祖先によって既に処理されたアイテムを除外しています。
SELECT ... FROM items i WHERE <additional queries on items>
AND id NOT IN (SELECT item FROM itemsProcessed WHERE processor IN (1, 2))
処理されたテーブルが非常に大きくなると、最初のアイテムを返し始める前に多くのフィルタリングを行う必要があるため、このクエリは長い時間 (数秒) かかり始めます (クエリ プランはハッシュ アンチジョインを使用しています)。
最初のいくつかの項目を非常に迅速に返すために、このクエリが必要です。理想的には、500ms 未満で最初の項目を返します。これは、反復処理をitems
行って 内のものを除外できないことを意味しitemsProcessed
ます。items
したがって、 andの結合で否定インデックスを実行する何らかの方法が必要ですitemsProcessed
(これは mongo で達成しましたが、oracle では同様のことができないようです)。
これはオラクルで可能ですか?