sql >> データベース >  >> RDS >> Oracle

Oracle:条件付きの全文検索

    Oracleテキスト

    1-FILTER BY:

    を使用してCONTEXTインデックスを作成することにより、パフォーマンスを向上させることができます。
    create index my_idx on my_table(text) indextype is ctxsys.context filter by group_id;
    

    私のテストでは、filter by パフォーマンスは確実に向上しましたが、group_idでbtreeインデックスを使用する方がわずかに高速でした。

    2-CTXCATインデックスは「サブインデックス」を使用し、複数列のインデックスと同様に機能するようです。これはあなたが探しているオプション(4)のようです:

    begin
      ctx_ddl.create_index_set('my_table_index_set');
      ctx_ddl.add_index('my_table_index_set', 'group_id');
    end;
    /
    
    create index my_idx2 on my_table(text) indextype is ctxsys.ctxcat
        parameters('index set my_table_index_set');
    
    select * from my_table where catsearch(text, 'blah', 'group_id = 43') > 0
    

    これはおそらく最速のアプローチです。 AおよびBシナリオと同様の120MBのランダムテキストに対して上記のクエリを使用すると、18回の一貫した取得のみが必要でした。ただし、欠点として、CTXCATインデックスの作成には約11分かかり、1.8GBのスペースを使用しました。

    (注:Oracle Textはここでは正しく機能しているようですが、私はTextに精通しておらず、@ NullUserExceptionが言ったように、これがこれらのインデックスの不適切な使用ではないことを保証できません。)

    複数列のインデックスとインデックス結合

    編集で説明する状況については、通常 (A、B)でインデックスを使用することと、AとBで別々のインデックスを結合することの間に大きな違いはありません。私はあなたが説明したものと同様のデータでいくつかのテストを構築し、インデックス結合は7つの一貫した取得と2つの一貫した取得のみを必要としました複数列のインデックスの場合。

    これは、Oracleがデータをブロック単位で取得するためです。ブロックは通常8Kであり、インデックスブロックはすでに並べ替えられているため、500〜2000の値をいくつかのブロックに収めることができます。パフォーマンスが心配な場合は、通常、ブロックの読み取りと書き込みを行うIOだけが重要です。 Oracleが数千行を結合する必要があるかどうかは、取るに足らない量のCPU時間です。

    ただし、これはOracleTextインデックスには適用されません。 CONTEXTインデックスをbtreeインデックス(「ビットマップと」?)と結合することはできますが、パフォーマンスは低下します。



    1. 医療予約アプリのデータモデル

    2. PostgreSQLで月ごとの成長を計算する方法

    3. SQLサーバーで日付データ型を使用するにはどうすればよいですか?

    4. MariaDBでサーバー照合を取得する3つの方法