Snowflakeの検索最適化サービスに関するメモ (Architect)

# これは何？

Snowflakeの[検索最適化サービス](https://docs.snowflake.com/ja/user-guide/search-optimization-service)についてまとめてみたメモ。

## おさらい

Snowflakeが提供するクエリパフォーマンスを最適化するための手段
- クラスタリング
- Query Acceleration
- マテリアライズドビュー
- `検索最適化サービス (Search Optimization Service)`

## 検索最適化サービス

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