Oracle Textに用意されているSEPARATE_OFFSETSオプションを使用すると、主に1つのワードまたはブールの問合せを対象としてIO操作を多用するCONTEXT索引の問合せパフォーマンスを改善することができます。
SEPARATE_OFFSETSオプションでは、TEXTタイプのトークンに対して作成されるポスト・リストの構造が異なります。DOCID、頻度、情報の長さ(オフセット情報の長さ)およびオフセットをポスト・リストに分散させるかわりに、SEPARATE_OFFSETSオプションではDOCIDと頻度をポスト・リストの最初にまとめて格納し、情報の長さとオフセットをポスト・リストの最後に格納します。ポストの先頭にあるヘッダーには、DOCIDとオフセットの間の境界点に関する情報が含まれています。このようにDOCIDとオフセットを分離すると、データを読み取る問合せの時間が短くなるため、問合せの応答時間が短縮されます。
SEPARATE_OFFSETSオプションのパフォーマンスが最大限に発揮されるのは、BIG_IOオプションと組み合せたときに、きわめて長いポストを持つトークンを対象とした場合です。
SEPARATE_OFFSETSオプションを指定してCONTEXT索引を作成するには、まずSEPARATE_OFFSETS記憶域属性の値をTに設定して基本記憶域プリファレンスを作成し、CONTEXT索引の作成時にこの記憶域プリファレンスを指定します。
次の例は、基本記憶域プリファレンスmystoreを作成し、そのSEPARATE_OFFSETS記憶域属性の値をTに設定します。
exec ctx_ddl.create_preference('mystore', 'BASIC_STORAGE');
exec ctx_ddl.set_attribute('mystore', 'SEPARATE_OFFSETS', 'T');
SEPARATE_OFFSETSオプションを無効にするには、SEPARATE_OFFSETS記憶域属性の値をFに設定して既存の記憶域プリファレンス(mystore)を更新してから、索引を再構築します。
exec ctx_ddl.set_attribute('mystore', 'SEPARATE_OFFSETS', 'F');
alter index idx rebuild('replace storage mystore');
索引を再構築せずにパーティション索引でSEPARATE_OFFSETSオプションを有効にするには、SEPARATE_OFFSETS記憶域属性の値をTに設定して基本記憶域プリファレンスを変更し、ctx_ddl.replace_index_metadataを使用してグローバル索引メタデータを置き換えてから、パーティション索引表のパーティションごとにREBUILDモードでoptimize_indexをコールします。
次の例は、パーティション索引idxに対してSEPARATE_OFFSETSを有効にします。
exec ctx_ddl.set_attribute('mystore', 'SEPARATE_OFFSETS', 'T');
exec ctx_ddl.replace_index_metadata('idx', 'replace storage mystore');
exec ctx_ddl.optimize_index('idx', 'rebuild', part_name=>'part1');