Oracle Text CTXSYS.CONTEXT 索引を使用して、メタ情報を含む約50万行の索引を作成しています。情報は、実行時にインデクサーが呼び出すプロシージャによって結合される 2 つのテーブルに分散されます (関数インデックス)。
ローカル マシン (単純なデュアルコア ノートブック) で CREATE INDEX を実行すると、約 3 分でインデックスが作成されます。8 コアと 16G の RAM を搭載した Solaris 上で動作する DB サーバーでは、同じ (まったく同じ) データのインデックスを作成するのに約 24 時間かかります。
サンプル コード: これは、2 つのテーブルと 3 つの列のインデックス フィーダーです。
create or replace procedure docmeta_revisions_text_feeder
( p_rowid in rowid , p_clob in out nocopy clob) as v_clob CLOB begin
FOR c1 IN (select DM.DID, DM.XDESCRIB || ' ' || DM.XAUTHOR AS data
from DOCMETA DM
WHERE ROWID = p_rowid)
LOOP
v_clob := v_clob || c1.data;
FOR c2 IN (
SELECT ' ' || RV.DDOCTITLE AS data
FROM REVISIONS RV
WHERE RV.DID = c1.DID)
LOOP
v_clob := v_clob || c2.data;
END LOOP;
END LOOP;
p_clob := v_clob;
end docmeta_revisions_text_feeder
これらは好みです
BEGIN
CTX_DDL.CREATE_PREFERENCE ('concat_DM_RV_DS', 'USER_DATASTORE');
CTX_DDL.SET_ATTRIBUTE ('concat_DM_RV_DS', 'PROCEDURE',
'docmeta_revisions_text_feeder');
END;
次に、インデックスを作成します
CREATE INDEX concat_DM_RV_idx ON DOCMETA (FULLTEXTIDX_DUMMY)
INDEXTYPE IS CTXSYS.CONTEXT
PARAMETERS ('datastore concat_DM_RV_DS
section group CTXSYS.AUTO_SECTION_GROUP
') PARALLEL 4;
データの大部分は、簡単なタイトルまたは著者名 + 1k 未満のテキストによる短い説明で構成されます。
関連するメモリ設定と PARALLEL パラメータを少し試してみましたが、成功しませんでした。だからここに私の質問があります:
- インデックス作成プロセスを一時停止して再開する方法はありますか (私は CTX_SYS ロールを手元に持っています)。
- どのパラメータを微調整できるか(特にメモリサイズ)のヒントはありますか?
- テキスト索引をエクスポートおよびインポートできますか? -> 次に、ローカル マシンでインデックス作成を実行し、それをサーバーにコピーするだけです。
- インデクサーは「低い優先度」で実行できますか?
- ロック操作によってインデクサーが乱れた可能性があります (他のユーザーが並行してアクセスするステージング マシンです)。関連するテーブルをロックし、インデックスを作成して後でロックを解除する方法はありますか?