これは何?
Snowflakeの検索最適化サービスについてまとめてみたメモ。
おさらい
Snowflakeが提供するクエリパフォーマンスを最適化するための手段
- クラスタリング
- Query Acceleration
- マテリアライズドビュー
検索最適化サービス (Search Optimization Service)
検索最適化サービス
- 次のようなテーブルに対する
特定の種類のクエリのパフォーマンスを大幅に向上させることを目的としている- テーブルの選択的な
ポイント検索クエリ - テキストや半構造化データで
部分文字列と正規表現の検索 - 特定のタイプの述語を使用する
VARIANT、OBJECT、および ARRAY 列のフィールドに対するクエリ- 浮動小数点データ型は未対応
- 照合順序も未対応
- GEOGRAPHY 値を持つ選択された
地理空間関数を使用するクエリ-
GEOMETRYは未対応
-
-
IN 述語を使用するクエリ - 検索最適化を適用する前の状態で、
数秒以上実行されるクエリ- ほとんどの場合、検索最適化では実行時間が1秒未満のクエリのパフォーマンスは大幅に向上しない
- テーブルの選択的な
- 必要な権限
- 検索最適化サービスの追加/変更/削除する場合の権限
- テーブルに対する
OWNERSHIP権限 - テーブルを含む
スキーマに対するADD SEARCH OPTIMIZATION権限
- テーブルに対する
- 検索最適化サービスを使用してクエリを実行する場合の権限
- 対象テーブルの
SELECT権限があれば良い- SEARCH OPTIMIZATIONはテーブルプロパティであるため、テーブルへの問い合わせ時に自動的に使用される
- 対象テーブルの
- 検索最適化サービスの追加/変更/削除する場合の権限
- 検索最適化を使用すると、
検索アクセスパスと呼ばれる追加の永続ストレージ構造が生成される - 検索最適化サービスは
サーバーレスで実行される - 検索最適化サービスを使用すると、
コンピューティングとストレージの両方のコストが発生する - 設定するには
SEARCH OPTIMIZATIONプロパティ を指定する-
ALTER TABLE … ADD SEARCH OPTIMIZATIONのように実行する -
ON 句では、検索最適化を有効にする列を指定する -
EQUALITYは ON句で指定できる「検索最適化アクション」の一種- 参考:検索最適化アクション
-
ON 句なしで ALTER TABLE … ADD SEARCH OPTIMIZATION コマンドを実行すると、その後テーブルに追加されるすべての列も EQUALITY に設定される- サポートされているデータ型のすべての列 (VARIANT と GEOGRAPHY を除く) に対して EQUALITY を指定する場合は、ON 句なしで ALTER TABLE … ADD SEARCH OPTIMIZATION コマンドを使用します
-
ON 句ありで ALTER TABLE … { ADD | DROP } SEARCH OPTIMIZATIONを実行すると、その後テーブルに追加される列はEQUALITYに自動的に設定されない
-
-
検索最適化による部分文字列と正規表現クエリの高速化
-
5文字以上の部分文字列を検索するときにパフォーマンスを向上させることができる
-
- データシェアリングを介しても有効になる
- データコンシューマーは、検索最適化サービスによるパフォーマンス向上のメリットを受けることができる
-
セカンダリデータベースのテーブルの操作(データベース複製のサポート)
- 検索最適化サービスを有効化していると、その
設定有無(プロパティ)は複製される - 検索最適化サービスの
検索アクセスパスは複製されない - 複製した後、セカンダリ側で
自動的に検索アクセスパスが生成される
- 検索最適化サービスを有効化していると、その
- テーブル/スキーマ/データベースをクローンすると、
検索アクセスパスもクローンされる(ゼロコピークローニングが機能する) -
CREATE TABLE ... LIKE ...では検索最適化サービスの設定有無は引き継げない - 検索最適化は、定数値への暗黙的および明示的なキャストを伴う述語をサポートしているが、実際のテーブル列に
値をキャストする述語はサポートしていない- INTEGERおよびNUMBERからVARCHARへのキャストを除く
- 検索最適化は、
外部テーブルとマテリアライズド ビューに追加できない - 述語の結合について
- AND
- 述語の結合 (AND) を使用するクエリの場合、
述語のいずれかが上記の条件に準拠していれば、検索最適化によってクエリ パフォーマンスを向上させることができる - 例 : where condition_x and condition_y
- いずれかの条件が個別に数行を返す場合 (つまり、condition_x が数行を返すか、condition_y が数行を返す場合)、検索最適化によってパフォーマンスを向上させることができる
- condition_x が数行を返すが condition_y が多数の行を返す場合、検索最適化によってクエリ パフォーマンスを向上させることができる
- 述語の結合 (AND) を使用するクエリの場合、
- OR
- 述語の論理和 (OR) を使用するクエリの場合、
すべての述語が上記の条件に準拠していれば、検索最適化によってクエリ パフォーマンスを向上させることができる - 例 : where condition_x or condition_y
- 各条件が個別に数行を返す場合 (つまり、condition_x が数行を返し、condition_y が数行を返す場合)、検索最適化によってパフォーマンスを向上させることができる
- condition_x が数行を返すが、condition_y が多くの行を返す場合、クエリ パフォーマンスは検索最適化によるメリットを得られない
- 論理和の場合、各述語は単独ではクエリ内で決定的ではない
- 述語の論理和 (OR) を使用するクエリの場合、
- 検索最適化によってパフォーマンスを向上できるかどうかを判断する前に、他の述語を評価する必要がある
- AND