
Oracle10gを使っています
OracleTextの索引はレコードの挿入や更新では自動的に更新されないとのことですが、それではどのタイミングで更新するのが適当なのでしょうか?
サーバーの性能にも左右されるのでしょうが、できればレコードの挿入等の度に索引の再構築をしたいのですがパフォーマンスに問題ありでしょうか。
ちなみに、テーブルは1つ、索引をつけているカラムは6つ、それぞれ500文字程度の日本語、1時間に10件程度のレコード挿入です。挿入のたびに
BEGIN
CTX_DDL.sync_index('索引名');
END;
を実行します。
また、再構築が同時に発生した場合はなにが起こるのでしょうか。
分かりにくい文章で申し訳ございません。テスト環境がないため本番環境で開発しているので自分で試してみることができず困っています。よろしくお願いします。
No.1ベストアンサー
- 回答日時:
Oracle Database 10g であれば、ON COMMITでの索引同期化が使えるのではないでしょうか。
ON COMMIT での索引同期化は、CREATE INDEX の PARAMETERS 句の SYNC オプションで指定できます。
既存の索引に対しては、
ALTER INDEX <索引名> REBUILD PARAMETERS ('REPLACE METADATA SYNC (ON COMMIT)');
で、同期化モードを変更できます。
これで、元表に対する更新処理が COMMIT されたタイミングで、索引情報も更新されるようになります。
同期化モードを、元の手動に戻すには、
ALTER INDEX <索引名> REBUILD PARAMETERS ('REPLACE METADATA SYNC (MANUAL)');
とします。
ただし、ON COMMIT での索引同期化では、索引が極端に断片化する可能性があります。
Oracle Text では、$I と呼ばれる内部表を用いて索引情報を管理しています。
新規に追加・更新されたレコードの索引情報は、この $I 表に新規に INSERT されます。(UPDATE ではなく、INSERT です。)
このため、索引の同期化を繰り返すうちに、索引が次第に断片化していきます。
このあたりの動作は、OTNオンデマンドの「Oracle Text 概要」という資料で説明されています。
http://www.oracle.com/technetwork/jp/content/ind …
→ http://www.oracle.com/technetwork/jp/content/ora …
→ p.9「索引メンテナンス ~ 新規文書情報の追加」
索引が断片化すると、検索パフォーマンスが劣化するため、索引の同期化処理は、要件が許す限り、頻度を低くすることが望ましいと考えられます。
また、索引が断片化してしまった場合には、索引を最適化すれば、検索パフォーマンスを回復させることができます。(同 p.10、p.12)
テスト環境が無いとのことですが、その気になれば、手元のパソコンにWindows版のOracle Databaseをインストールすることもできるのではないでしょうか。テスト環境であれば、物理メモリが 1 GB もあれば十分です。
なお、テスト目的でのインストールであれば、ライセンス上の問題はありません。実際、「Oracle Technology Network Developer License Terms」には以下のように記載されています。
We grant you a nonexclusive, nontransferable limited license to use the programs only for the purpose of developing, testing, prototyping and demonstrating your application, and not for any other purpose.
http://www.oracle.com/technetwork/licenses/stand …
以上、ご参考になれば幸いです。
参考URL:http://www.oracle.com/technetwork/jp/content/ind …
詳しいご回答ありがとうございます。
ON COMMIT、うまく動作しました。感激です。検索パフォーマンスについても了解しました。負荷が少なくなる深夜にでもバッチで最適化してみようと思います。あとはレコードの新規・更新のたびにインデックスの作成をすることによる負荷が気になるところです。
テスト環境の件ですが、ORACLEXEというものをインストールしてみました。テスト環境もできたことですし、いろいろ試してみようと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Viewにインデックスは張れ...
-
INDEXの無効化
-
SQL*Loaderで、データを加工し...
-
OracleTextの索引再構築について
-
可変個数のデータはどう納める?
-
アナライズとインデックス作成...
-
表領域のパーティション分割時...
-
主キー以外の項目にNotNull制約...
-
SQL*LoaderとInsertの違いについて
-
postgreSQLのint型は桁数指定が...
-
データを削除しても表領域の使...
-
select insert 句
-
datapumpの実行方法について
-
同じSELECT文同士でのデ...
-
Data Pump で大量データインポ...
-
ORA-00959: 表領域'****'は...
-
異なるスキーマからデータを抽...
-
ある英語の問題のコト
-
レコードのコピーについて
-
updateで
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Viewにインデックスは張れ...
-
INDEXの無効化
-
SQL*Loaderで、データを加工し...
-
アナライズとインデックス作成...
-
文字列中のスペースを排除する...
-
OracleTextの索引再構築について
-
可変個数のデータはどう納める?
-
SQL*LoaderとInsertの違いについて
-
オラクル クラサバ環境で動作...
-
主キー以外の項目にNotNull制約...
-
インデックス作成後アナライズ...
-
論理読み込みブロック数とは?
-
長年放置しているOracleを…なん...
-
テスト環境と本番環境で、DBか...
-
IN 句ではインデックスが使用さ...
-
Oracle Databaseのインデックス...
-
PervasiveSQL (Btrieve) で、デ...
-
索引の再構築をすべき?
-
Wordで複数の索引を作りたい
-
Oracleのあいまい検索について
おすすめ情報