これは何?
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