検索最適化によるテキストクエリの高速化¶
Search optimization can improve the performance of queries that use the SEARCH and SEARCH_IP functions. These queries search for character data (text) and IP addresses in specified columns from one or more tables, including elements in VARIANT, OBJECT, and ARRAY columns.
以下のセクションでは、テキストクエリの検索最適化サポートに関する詳細情報を提供します。
テキストクエリの検索最適化の実現¶
テーブルに対するテキストクエリのパフォーマンスを向上させるには、 ALTERTABLE ... ADD SEARCH OPTIMIZATION コマンド で、特定の列に対して ON FULL_TEXT 句を使用します。テーブルレベルで検索最適化を有効にしても、 SEARCH または SEARCH_IP 関数を使用するクエリでは有効にはなりません。
例:
ALTER TABLE lines ADD SEARCH OPTIMIZATION
ON FULL_TEXT(play, character, line);
詳細については、 検索最適化の有効化と無効化 をご参照ください。
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');
DESCRIBE SEARCH OPTIMIZATION ON lines;
+---------------+----------------------------+--------+------------------+--------+
| 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);
DESCRIBE SEARCH OPTIMIZATION ON lines;
+---------------+----------------------------+--------+------------------+--------+
| 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;
+---------------+----------------------------+--------+------------------+--------+
| expression_id | method | target | target_data_type | active |
|---------------+----------------------------+--------+------------------+--------|
| 1 | FULL_TEXT DEFAULT_ANALYZER | SRC | VARIANT | true |
+---------------+----------------------------+--------+------------------+--------+
OBJECT 列で FULL_TEXT 検索最適化を有効にする¶
以下の例では、 OBJECT 列に対して FULL_TEXT 検索最適化を有効にします。
まず、 OBJECT 列を持つテーブルを作成し、データを挿入します。
CREATE OR REPLACE TABLE so_object_example (object_column OBJECT);
INSERT INTO so_object_example (object_column)
SELECT OBJECT_CONSTRUCT('a', 1::VARIANT, 'b', 2::VARIANT);
以下のコマンドは、 OBJECT 列の FULL_TEXT 検索最適化を有効にします。
ALTER TABLE so_object_example ADD SEARCH OPTIMIZATION
ON FULL_TEXT(object_column);
DESCRIBE SEARCH OPTIMIZATION ON so_object_example;
+---------------+----------------------------+---------------+------------------+--------+
| expression_id | method | target | target_data_type | active |
|---------------+----------------------------+---------------+------------------+--------|
| 1 | FULL_TEXT DEFAULT_ANALYZER | OBJECT_COLUMN | OBJECT | true |
+---------------+----------------------------+---------------+------------------+--------+
ARRAY 列で FULL_TEXT 検索最適化を有効にする¶
以下の例では、 ARRAY 列に対して FULL_TEXT 検索最適化を有効にします。
まず、 ARRAY 列を持つテーブルを作成し、データを挿入します。
CREATE OR REPLACE TABLE so_array_example (array_column ARRAY);
INSERT INTO so_array_example (array_column)
SELECT ARRAY_CONSTRUCT('a', 'b', 'c');
以下のコマンドは、 ARRAY 列の FULL_TEXT 検索最適化を有効にします。
ALTER TABLE so_array_example ADD SEARCH OPTIMIZATION
ON FULL_TEXT(array_column);
DESCRIBE SEARCH OPTIMIZATION ON so_array_example;
+---------------+----------------------------+--------------+------------------+--------+
| expression_id | method | target | target_data_type | active |
|---------------+----------------------------+--------------+------------------+--------|
| 1 | FULL_TEXT DEFAULT_ANALYZER | ARRAY_COLUMN | ARRAY | 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;
+---------------+----------------------------+----------------+------------------+--------+
| 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;
DESCRIBE SEARCH OPTIMIZATION ON lines;
+---------------+----------------------------+--------+------------------+--------+
| 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(*);
DESCRIBE SEARCH OPTIMIZATION ON lines;
+---------------+----------------------------+----------------+------------------+--------+
| 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);
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.