Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - SQL の使用法 » データのクエリと変更 » データのクエリ » テキスト・インデックス

 

テキスト・インデックスの再表示タイプ

テキスト・インデックスを作成する場合、「再表示タイプ」も選択する必要があります。テキスト・インデックスでは、即時、自動、手動の 3 つの再表示タイプがサポートされています。再表示タイプは、テキスト・インデックスの作成時に定義します。即時テキスト・インデックスの場合を除き、再表示タイプはテキスト・インデックスの作成後に変更できます。

再表示タイプの設定方法については、CREATE TEXT INDEX 文ALTER TEXT INDEX 文を参照してください。

  • 即時再表示 (デフォルト)   即時再表示のテキスト・インデックスは、基本となるテーブルのデータに変更があると再表示されます。データを常に最新の状態に保つ必要がある場合、またはインデックス付けされたカラムが比較的短い場合においてのみ使用することをおすすめします。

    テキスト・インデックスのデフォルトの再表示タイプは即時です。

    自動再表示または手動再表示のテキスト・インデックスを、即時再表示のテキスト・インデックスに変更することはできません。変更したい場合は、該当するテキスト・インデックスを削除して、即時再表示のテキスト・インデックスとして再作成する必要があります。

    即時再表示のテキスト・インデックスはすべての独立性レベルをサポートします。即時再表示のテキスト・インデックスは、作成時にデータが設定され、この初期再表示中に、テーブルに排他ロックがかけられます。

  • 自動再表示   自動再表示のテキスト・インデックスは、指定された間隔で自動的に再表示されます。データがある程度古くなってもかまわない場合に使用することをおすすめします。古いインデックスを問い合わせると、一致するローのうち、最後に再表示されてから変更されていないものが返されます。したがって、最後の再表示以降に挿入、削除、更新されたローはクエリで返されません。

    自動再表示のテキスト・インデックスは、次のどちらかの状態が該当する場合は、指定された間隔よりも頻繁に再表示される可能性があります。それは、最後の再表示からの経過時間が再表示間隔よりも長い場合、または保留中のすべてのローの合計長 (sa_text_index_stats システム・プロシージャによって返される pending_length) が合計インデックス・サイズ (sa_text_index_stats によって返される doc_length) の 20 % を超える場合、のどちらかです。

    自動再表示のテキスト・インデックスは、独立性レベル 0 を使用して再表示されます。

    自動再表示のテキスト・インデックスには、作成時にはデータが含まれていないため、最初の再表示が行われるまで利用できません。最初の再表示は通常、テキスト・インデックスが作成されてから 1 分以内に行われます。REFRESH TEXT INDEX 文を使用することで、自動再表示のテキスト・インデックスを手動で再表示することもできます。

    自動再表示のテキスト・インデックスは、dbunload で -g オプションを指定しないかぎり、再ロード時に再表示されません。アンロード・ユーティリティ (dbunload)を参照してください。

  • 手動再表示   手動再表示のテキスト・インデックスは、ユーザの実行によってのみ再表示されます。基本となるテーブルのデータがめったに変更されない場合、データの古さの程度が大きくても許容できる場合、またはイベントや条件を満たした後に再表示したい場合に使用することをおすすめします。古いインデックスを問い合わせると、一致するローのうち、最後に再表示されてから変更されていないものが返されます。したがって、最後の再表示以降に挿入、削除、更新されたローはクエリで返されません。

    手動再表示のテキスト・インデックスには、独自の再表示方針を定義できます。たとえば、引数として渡される再表示間隔と、自動再表示のテキスト・インデックスに使用されるものと同様のルールを使用して、すべての手動再表示のテキスト・インデックスを再表示するプロシージャを使用できます。

    次の例で、text-index-nametable-ownertable-name を適宜置き換えてください。

    CREATE PROCEDURE refresh_manual_text_indexes( 
       refresh_interval UNSIGNED INT )
    BEGIN
     FOR lp1 AS c1 CURSOR FOR
       SELECT ts.*
       FROM SYS.SYSTEXTIDX ti JOIN sa_text_index_stats( ) ts
       ON ( ts.index_id = ti.index_id )
       WHERE ti.refresh_type = 1 -- manual refresh indexes only
     DO
       BEGIN
        IF last_refresh IS null 
        OR cast(pending_length as float) / (
           IF doc_length=0 THEN NULL ELSE doc_length ENDIF) > 0.2
        OR DATEDIFF( MINUTE, CURRENT TIMESTAMP, last_refresh )
           > refresh_interval THEN
         EXECUTE IMMEDIATE 'REFRESH TEXT INDEX ' || text-index-name || ' ON "'
         || table-owner || '"."' || table-name || '"';
        END IF;
       END;
      END FOR;
    END;

    いつでも、sa_text_index_stats システム・プロシージャを使用して、再表示が必要かどうか、再表示を完全再構築にするか、増分更新にするかを決定できます。sa_text_index_stats システム・プロシージャを参照してください。

    手動再表示のテキスト・インデックスには、作成時にはデータが含まれていないため、再表示するまで利用できません。手動再表示のテキスト・インデックスを再表示するには、REFRESH TEXT INDEX 文を使用します。

    手動再表示のテキスト・インデックスは、dbunload で -g オプションを指定しないかぎり、再ロード時に再表示されません。アンロード・ユーティリティ (dbunload)を参照してください。

参照