検索最適化の有効化と無効化¶
検索最適化を有効にするには、必要な権限を持つロールを使用し、 ALTER TABLE ... ADD SEARCH OPTIMIZATION コマンドを使用して、テーブル全体または特定の列に対して検索最適化を有効にします。
必要なアクセス制御権限¶
テーブルの検索最適化を追加、構成、または削除するには、次が必要です。
テーブルに対する OWNERSHIP 権限を所有します。
テーブルを含むスキーマに対する ADD SEARCH OPTIMIZATION 権限を所有します。この権限を付与するには:
GRANT ADD SEARCH OPTIMIZATION ON SCHEMA <schema_name> TO ROLE <role>
クエリに検索最適化サービスを使用するには、テーブルに対する SELECT 権限が必要。
その他の権限は必要ありません。SEARCH OPTIMIZATION はテーブルプロパティであるため、テーブルのクエリ時に自動的に検出され、(適切な場合は)使用されます。
検索最適化の構成¶
注釈
大きなテーブル(テラバイト(TB)以上のデータを含むテーブル)に検索最適化を追加すると、短期間にクレジット消費量が即座に増加する可能性があります。
テーブルに検索最適化を追加すると、メンテナンスサービスは、すぐにバックグラウンドでテーブルの検索アクセスパスの構築を開始します。テーブルが大きい場合、メンテナンスサービスがこの作業を大規模に並列化する可能性があり、その結果、短期間にコストが増加する可能性があります。
大きなテーブルに検索最適化を追加する前に、 これらのコストの見積もりを取得 して、何が起きるかを把握します。
検索最適化を有効にする場合、テーブル全体またはテーブル内の特定の列に対して有効にするかどうかを選択できます。
テーブル全体の検索最適化を有効にすると、対象となるすべての列に対するポイントルックアップクエリが可能になります。
テーブル全体の検索最適化を有効にするには、 ON 句を使用 せずに ALTER TABLE ... ADD SEARCH OPTIMIZATION コマンドを使用します。
特定の列の検索最適化を有効にすると、クエリであまり使用しない列の検索アクセスパスの作成にクレジットを費やす必要がなくなります。また、列ごとに最適化するクエリの種類を追加選択できるため、パフォーマンスがさらに向上する可能性があります。
ALTER TABLE ... ADD SEARCH OPTIMIZATION コマンド の ON 句 を使用して、最適化するクエリの種類を指定し、特定の列の検索最適化を有効にします。ADD SEARCH OPTIMIZATION の ON 句で、検索最適化を有効にする列を指定します。特定の列の検索最適化を有効にすると、検索方法も指定できます (たとえば、等価検索と IN 検索の場合は EQUALITY 、 GEOGRAPHY 検索の場合は GEO 、部分文字列検索の場合は SUBSTRING)。同じ列で複数の検索方法を有効にすることができます。
一般的には、特定の列に対してのみ検索最適化を有効にするのがベストプラクティスです。
次のセクションでは、テーブルの検索最適化を構成する方法について説明します。
検索最適化を構成した後、設定が正しいかどうかを検査することができます。
検索最適化が十分な利益をもたらさないことが判明した場合、特定の列またはテーブル全体から検索最適化を削除することができます。
特定の列に対する検索最適化の有効化¶
特定の列の検索最適化を構成するには、 ALTER TABLE ... ADD SEARCH OPTIMIZATION コマンドを ON 句と合わせて使用します。
注釈
このコマンドを実行しているときは、 テーブルに検索最適化を追加する権限 を持つロールを使用します。
ON 句は、特定の列の検索最適化を構成することを指定します。構文の詳細については、 ALTER TABLE ... ADD SEARCH OPTIMIZATION のセクション をご参照ください。
注釈
テーブル内の該当するすべての列に等価および IN 述語の検索最適化を適用するだけの場合は、 テーブル全体に対する検索最適化の有効化 をご参照ください。
このコマンドを実行すると、 列が検索最適化用に構成されていることを確認できます。
次のセクションには、検索最適化の構成を指定する方法を示す例が含まれています。
例: 特定の列での全文検索の最適化¶
SEARCH および SEARCH_IP 関数を使用してテキスト検索を実行できます。これらの関数を使用する場合のクエリ実行パフォーマンスを向上させるには、 FULL_TEXT 検索最適化を有効にします。テーブル内の列の異なるサブセットと異なるテキスト アナライザーを使用することで、テーブルで FULL_TEXT 検索最適化を有効にすることができます。異なるアナライザーの動作については、 検索語のトークン化方法 をご参照ください。
以下の構文を使用して、テーブル内の列セットに対して FULL_TEXT 検索最適化を有効にします。
ALTER TABLE <name> ADD SEARCH OPTIMIZATION
ON FULL_TEXT( { * | <col1> [ , <col2>, ... ] } [ , ANALYZER => '<analyzer_name>' ]);
指定する列は VARCHAR または VARIANT 列にする必要があります。他のデータ型の列はサポートされていません。VARIANT 列全体に加えて、それらの列内のフィールドへの個別のパス <label-traversing_semistructured_data> も指定できます。
列のリストの代わりにワイルドカードのアスタリスク文字(*
)を指定できます。この場合、テーブル内のすべての VARCHAR 列 VARIANT 列に対して最適化が自動的に有効になります。テーブルに ARRAY または OBJECT 列が存在する場合、それらの列では最適化は有効になりません。
指定される ANALYZER => 'analyzer_name' 引数は、 SEARCH 関数について文書化されている選択肢の1つでなければなりません。アナライザーを指定しない場合は、 DEFAULT_ANALYZER が使用されます。
注釈
SEARCH 関数を使用したクエリ実行を最適化するには、 ALTER TABLE コマンドで検索最適化に指定したアナライザーが、 SEARCH 関数呼び出しで指定したアナライザーと同じである必要があります。アナライザーが一致しない場合は、検索アクセスパスは選択されません。
この例では、 SEARCH クエリのターゲットとなる可能性のある3つの VARCHAR 列で FULL_TEXT 検索最適化を有効にします。
ALTER TABLE lines ADD SEARCH OPTIMIZATION
ON FULL_TEXT(play, character, line);
このテーブルの検索最適化構成を説明するには、以下のコマンドを実行します。
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 | CHARACTER | VARCHAR(30) | true |
| 3 | FULL_TEXT DEFAULT_ANALYZER | LINE | VARCHAR(2000) | true |
+---------------+----------------------------+-----------+------------------+--------+
詳細については、 テーブルの検索最適化構成の表示 をご参照ください。
この例では、 SEARCH_IP クエリのターゲットとなる可能性のある VARCHAR 列で FULL_TEXT 検索最適化を有効にします。
ALTER TABLE ipt ADD SEARCH OPTIMIZATION ON FULL_TEXT(ip1, ANALYZER => 'ENTITY_ANALYZER');
検索最適化構成を削除するには、以下のいずれかのコマンドを実行します。
ALTER TABLE lines DROP SEARCH OPTIMIZATION
ON FULL_TEXT(play, character, line);
ALTER TABLE lines DROP SEARCH OPTIMIZATION
ON play, character, line;
ALTER TABLE lines DROP SEARCH OPTIMIZATION
ON 1, 2, 3;
3番目の ALTER TABLE ... DROP SEARCH OPTIMIZATION コマンドでは、 1, 2, 3
は IDs コマンドによって返される式 DESCRIBE を参照します。
列のサブセットを(名前または式 ID で)削除することで、 FULL_TEXT 検索最適化構成を変更することもできます。詳細については、 特定の列またはテーブル全体からの検索最適化の削除 をご参照ください。
FULL_TEXT 検索最適化を有効にしたり削除したりするその他の例については、 ADD (および DROP) FULL_TEXT 検索最適化の例 をご参照ください。
例: 特定の列に対する等価および IN 述語のサポート¶
テーブル t1
内の列 c1
、 c2
、および c3
の等価述語を使用して検索を最適化するには、次のステートメントを実行します。
ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c1, c2, c3);
ON 句で同じ検索方法を複数回指定することもできます。
-- This statement is equivalent to the previous statement.
ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c1), EQUALITY(c2, c3);
例: 該当するすべての列に対する等価および IN 述語のサポート¶
テーブル内の該当するすべての列に対して等価述語を使用して検索を最適化するには、次のステートメントを実行します。
ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(*);
次の点に注意してください。
検索方法およびターゲットの構文の説明 で説明されているように、特定の方法では、アスタリスクと特定の列を指定することはできません。
ON 句を省略すると、テーブル内の該当するすべての列に対する等価および IN 述語の検索最適化も構成されますが、 ON 句の指定と省略には違いがあります。 テーブル全体に対する検索最適化の有効化 をご参照ください。
例: さまざまなタイプの述語のサポート¶
列 c1
および c2
の等価述語による検索と、列 c3
の部分文字列検索を最適化するには、次のステートメントを実行します。
ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c1, c2), SUBSTRING(c3);
例: 同じ列に対する異なる述語のサポート¶
同じ列、 c1
、に対する等号述語と部分文字列述語の両方の検索を最適化するには、以下のステートメントを実行します。
ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c1), SUBSTRING(c1);
例: VARIANT のフィールドに対する等価および IN 述語のサポート¶
VARIANT 列 c4
のフィールド user
にネストされた VARIANT フィールド uuid
の等価述語を使用して検索を最適化するには、次のステートメントを実行します。
ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c4:user.uuid);
例: 地理空間関数のサポート¶
c1
列の GEOGRAPHY オブジェクトで地理空間関数を使用する述語で検索を最適化するには、次のステートメントを実行します。
ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON GEO(c1);
テーブル全体に対する検索最適化の有効化¶
サポートされているデータ型 (VARIANT および GEOGRAPHY を除く) のすべての列に EQUALITY を指定する場合は、 ON 句なしで ALTER TABLE ... ADD SEARCH OPTIMIZATION コマンドを使用します。
注釈
このコマンドを実行しているときは、 テーブルに検索最適化を追加する権限 を持つロールを使用します。
例:
alter table test_table add search optimization;
構文の詳細については、 ALTER TABLE にある検索最適化のセクション をご参照ください。
このコマンドを実行すると、 列が検索最適化用に構成されていることを確認できます。
後で追加された列への影響¶
ON 句なしで ALTER TABLE ... ADD SEARCH OPTIMIZATION コマンドを実行すると、その後テーブルに追加されるすべての列も最適化のために EQUALITY に構成されます。
ただし、同じテーブルで ON 句のある ALTER TABLE ... { ADD | DROP } SEARCH OPTIMIZATION を指定すると、その後テーブルに追加される列は EQUALITY 用に自動では構成されません。これらの新しく追加された列を EQUALITY 用に構成するには、 ALTER TABLE ... ADD SEARCH OPTIMIZATION ON ... を実行する必要があります。
テーブルが検索最適化用に構成されていることの確認¶
テーブルとその列が検索最適化用に構成されていることを確認するには、
テーブルとその列の 検索最適化構成を表示 します。
SHOW TABLES コマンドを実行して、検索最適化が追加されていることを確認し、テーブルがどの程度最適化されているかを判断します。
例:
SHOW TABLES LIKE '%test_table%';
このコマンドの出力により、
SEARCH_OPTIMIZATION が
ON
であることを確認します。これは、検索最適化が追加されたことを示しています。SEARCH_OPTIMIZATION_PROGRESS の値を確認します。これは、これまでに最適化されたテーブルの割合を指定します。
検索最適化が最初にテーブルに追加されたとき、パフォーマンスの利点はすぐには現れません。検索最適化サービスは、バックグラウンドでデータの入力を開始します。メンテナンスがテーブルの現在の状態に追いつくにつれて、利点の増加が明らかになります。
クエリを実行して検索最適化が機能していることを確認する前に、テーブルが完全に最適化されたことを示すまで待ちます。
クエリを実行して、検索最適化が機能していることを確認します。
Snowflakeオプティマイザーは、特定のクエリに対して検索最適化サービスをいつ使用するかを自動的に選択することに注意してください。ユーザーは、どのクエリ検索最適化を使用するかについては制御できません。
検索最適化サービスが最適化するように設計されているクエリを選択します。 検索最適化のメリットがあるクエリの特定 をご参照ください。
ウェブ UI で、このクエリのクエリプランを表示し、クエリノード「検索最適化アクセス」がクエリプランの一部であることを確認します。
テーブルの検索最適化構成の表示¶
テーブルの検索最適化構成を表示するには、 DESCRIBE SEARCH OPTIMIZATION コマンドを使用します。
たとえば、次のステートメントを実行して、列の検索最適化を構成するとします。
ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c1);
DESCRIBE SEARCH OPTIMIZATION を実行すると、次の出力が生成されます。
DESCRIBE SEARCH OPTIMIZATION ON t1;
+---------------+----------+--------+------------------+--------+
| expression_id | method | target | target_data_type | active |
+---------------+----------+--------+------------------+--------+
| 1 | EQUALITY | C1 | NUMBER(38,0) | true |
+---------------+----------+--------+------------------+--------+
特定の列またはテーブル全体からの検索最適化の削除¶
特定の列に対する検索最適化構成を削除できます。または、テーブル全体から SEARCH OPTIMIZATION プロパティを削除できます。
特定の列に対する検索最適化のドロップ¶
特定の列の検索最適化構成をドロップするには、 ON 句のある ALTER TABLE ... DROP SEARCH OPTIMIZATION コマンドを使用します。
たとえば、 DESCRIBE SEARCH OPTIMIZATION コマンドを実行すると、次の式が出力されるとします。
DESCRIBE SEARCH OPTIMIZATION ON t1;
+---------------+-----------+-----------+-------------------+--------+
| expression_id | method | target | target_data_type | active |
+---------------+-----------+-----------+-------------------+--------+
| 1 | EQUALITY | C1 | NUMBER(38,0) | true |
| 2 | EQUALITY | C2 | VARCHAR(16777216) | true |
| 3 | EQUALITY | C4 | NUMBER(38,0) | true |
| 4 | EQUALITY | C5 | VARCHAR(16777216) | true |
| 5 | EQUALITY | V1 | VARIANT | true |
| 6 | SUBSTRING | C2 | VARCHAR(16777216) | true |
| 7 | SUBSTRING | C5 | VARCHAR(16777216) | true |
| 8 | GEO | G1 | GEOGRAPHY | true |
| 9 | EQUALITY | V1:"key1" | VARIANT | true |
| 10 | EQUALITY | V1:"key2" | VARIANT | true |
+---------------+-----------+-----------+-------------------+--------+
列 c2
の部分文字列に対する検索最適化をドロップするには、次のステートメントを実行します。
ALTER TABLE t1 DROP SEARCH OPTIMIZATION ON SUBSTRING(c2);
列 c5
のすべてのメソッドに対する検索最適化をドロップするには、次のステートメントを実行します。
ALTER TABLE t1 DROP SEARCH OPTIMIZATION ON c5;
列 c5
は等価検索と部分文字列検索を最適化するように構成されているため、上記のステートメントは c5
の等価検索と部分文字列検索の構成をドロップします。
列 c1
の等価性に対する検索最適化をドロップし、式 IDs 6
および 8
で指定された構成をドロップするには、次のステートメントを実行します。
ALTER TABLE t1 DROP SEARCH OPTIMIZATION ON EQUALITY(c1), 6, 8;
構文の詳細については、 ALTER TABLE ... DROP SEARCH OPTIMIZATION のセクション をご参照ください。
テーブルからの検索最適化の削除¶
テーブルから SEARCH OPTIMIZATION プロパティを削除するには、
テーブルから検索最適化を削除する権限 があるロールに切り替えます。
ON 句なしで ALTER TABLE ... DROP SEARCH OPTIMIZATION コマンドを実行します。
ALTER TABLE [IF EXISTS] <table_name> DROP SEARCH OPTIMIZATION;
例:
alter table test_table drop search optimization;
詳細については、 ALTER TABLE ... DROP SEARCH OPTIMIZATION のセクション をご参照ください。