検索最適化によるテキストクエリの高速化

検索最適化により、 SEARCH および SEARCH_IP 関数を使用するクエリのパフォーマンスが向上します。これらのクエリは、 VARIANT、 OBJECT、および ARRAY 列のフィールドを含む1つ以上のテーブルから指定された列の文字データ(テキスト)と IPv4 アドレスを検索します。

注釈

ON 句を使用した ALTER TABLE ... ADD SEARCH OPTIMIZATION コマンドで特定の列に対してこの機能を有効にする必要があります。例:

ALTER TABLE lines ADD SEARCH OPTIMIZATION
  ON FULL_TEXT(play, character, line);
Copy

ON 句を省略しても、文字列検索は最適化されません。

次のセクションで詳細を説明します。

FULL_TEXT 検索最適化のランタイム使用条件

SEARCH 関数を使用してクエリされるテーブルで FULL_TEXT 検索最適化を有効にすると、クエリの計画と実行中に最適化の検索アクセスパスを使用できるようになります。以下の条件を満たす必要があります。

  • 検索最適化が使用できる状態になっている必要があります(DESCRIBE SEARCH OPTIMIZATION の出力では、 active 列 = TRUE)。

  • 検索最適化は、 SEARCH 述語で指定されたカラムのスーパーセットで有効にする必要があります。たとえば、テーブルに VARCHAR 列 c1,c2,c3,c4,c5 が含まれており、検索最適化が列 c1,c2,c3 をカバーし、関数がそれらの列の1つ、2つ、または3つを検索する場合(ただし、 c4 または c5 は除く)、クエリは FULL_TEXT 検索最適化の恩恵を受けることができます。

  • ALTER TABLE コマンドで検索最適化用に定義されたアナライザーは、 SEARCH 関数呼び出しで指定されたアナライザーと同じである必要があります。

Tip

クエリに特定の検索アクセスパスが使用されたかどうかを確認するには、クエリプロファイルで Search Optimization Access ノードを探します。

ADD (および DROP) FULL_TEXT 検索最適化の例

次の例は、 FULL_TEXT 関数を使用してテーブル内の列をクエリするときに、その列で SEARCH 検索最適化を有効にしてクエリパフォーマンスを向上させる方法を示しています。

特定のアナライザーで FULL_TEXT 検索最適化を有効にする

以下の例では、1つの列に対して FULL_TEXT 検索最適化を有効にし、アナライザーを指定しています。最適化タイプとアナライザー(method)の組み合わせは、 DESCRIBE 出力に反映されます。

ALTER TABLE lines ADD SEARCH OPTIMIZATION
  ON FULL_TEXT(line, ANALYZER => 'UNICODE_ANALYZER');
Copy
DESCRIBE SEARCH OPTIMIZATION ON lines;
Copy
+---------------+----------------------------+--------+------------------+--------+
| expression_id | method                     | target | target_data_type | active |
|---------------+----------------------------+--------+------------------+--------|
|             1 | FULL_TEXT UNICODE_ANALYZER | LINE   | VARCHAR(2000)    | true   |
+---------------+----------------------------+--------+------------------+--------+

デフォルトのアナライザーで同じ列の FULL_TEXT 検索最適化を有効にすると、 DESCRIBE 出力により2行が返され、2つのエントリはを式 ID とメソッドで区別できます。

ALTER TABLE lines ADD SEARCH OPTIMIZATION
  ON FULL_TEXT(line);
Copy
DESCRIBE SEARCH OPTIMIZATION ON lines;
Copy
+---------------+----------------------------+--------+------------------+--------+
| expression_id | method                     | target | target_data_type | active |
|---------------+----------------------------+--------+------------------+--------|
|             1 | FULL_TEXT UNICODE_ANALYZER | LINE   | VARCHAR(2000)    | true   |
|             2 | FULL_TEXT DEFAULT_ANALYZER | LINE   | VARCHAR(2000)    | false  |
+---------------+----------------------------+--------+------------------+--------+

VARIANT 列で FULL_TEXT 検索最適化を有効にする

以下のコマンドは、 VARIANT 列の FULL_TEXT 検索最適化を有効にします。(この car_sales テーブルとそのデータについては、 半構造化データのクエリ で説明しています)。

ALTER TABLE car_sales ADD SEARCH OPTIMIZATION
  ON FULL_TEXT(src);

DESCRIBE SEARCH OPTIMIZATION ON car_sales;
Copy
+---------------+----------------------------+--------+------------------+--------+
| expression_id | method                     | target | target_data_type | active |
|---------------+----------------------------+--------+------------------+--------|
|             1 | FULL_TEXT DEFAULT_ANALYZER | SRC    | VARIANT          | true   |
+---------------+----------------------------+--------+------------------+--------+

1つまたは複数の列から FULL_TEXT 最適化を削除する

複数の列で FULL_TEXT 最適化を有効にし、後でそれらの列の1つ以上から最適化を削除できます。残りの列はまだ最適化されています。

ALTER TABLE lines ADD SEARCH OPTIMIZATION
  ON FULL_TEXT(play, act_scene_line, character, line, ANALYZER => 'UNICODE_ANALYZER');

DESCRIBE SEARCH OPTIMIZATION ON lines;
Copy
+---------------+----------------------------+----------------+------------------+--------+
| expression_id | method                     | target         | target_data_type | active |
|---------------+----------------------------+----------------+------------------+--------|
|             1 | FULL_TEXT UNICODE_ANALYZER | PLAY           | VARCHAR(50)      | true   |
|             2 | FULL_TEXT UNICODE_ANALYZER | ACT_SCENE_LINE | VARCHAR(10)      | true   |
|             3 | FULL_TEXT UNICODE_ANALYZER | CHARACTER      | VARCHAR(30)      | true   |
|             4 | FULL_TEXT UNICODE_ANALYZER | LINE           | VARCHAR(2000)    | true   |
+---------------+----------------------------+----------------+------------------+--------+
ALTER TABLE lines DROP SEARCH OPTIMIZATION ON 1, 2, 3;
Copy
DESCRIBE SEARCH OPTIMIZATION ON lines;
Copy
+---------------+----------------------------+--------+------------------+--------+
| expression_id | method                     | target | target_data_type | active |
|---------------+----------------------------+--------+------------------+--------|
|             4 | FULL_TEXT UNICODE_ANALYZER | LINE   | VARCHAR(2000)    | true   |
+---------------+----------------------------+--------+------------------+--------+

ワイルドカード(*)を使用して、すべての条件に該当する列で検索最適化を有効にします。

以下の ALTER TABLE コマンドは、 lines テーブル内の4つの VARCHAR 列すべてに対して FULL_TEXT 検索最適化を有効にします。

ALTER TABLE lines ADD SEARCH OPTIMIZATION
  ON FULL_TEXT(*);
Copy
DESCRIBE SEARCH OPTIMIZATION ON lines;
Copy
+---------------+----------------------------+----------------+------------------+--------+
| expression_id | method                     | target         | target_data_type | active |
|---------------+----------------------------+----------------+------------------+--------|
|             1 | FULL_TEXT DEFAULT_ANALYZER | PLAY           | VARCHAR(50)      | true   |
|             2 | FULL_TEXT DEFAULT_ANALYZER | ACT_SCENE_LINE | VARCHAR(10)      | true   |
|             3 | FULL_TEXT DEFAULT_ANALYZER | CHARACTER      | VARCHAR(30)      | true   |
|             4 | FULL_TEXT DEFAULT_ANALYZER | LINE           | VARCHAR(2000)    | true   |
+---------------+----------------------------+----------------+------------------+--------+

FULL_TEXT 最適化を有効にすると予想されるエラー

以下の ALTER TABLE コマンドは、指定された列の1つが NUMBER 列であるため、予想されるエラーで失敗します。

ALTER TABLE lines ADD SEARCH OPTIMIZATION
  ON FULL_TEXT(play, speech_num, act_scene_line, character, line);
Copy
001128 (42601): SQL compilation error: error line 1 at position 76
Expression FULL_TEXT(IDX_SRC_TABLE.SPEECH_NUM) cannot be used in search optimization.