【Snowflake】Snowflakeのパフォーマンス改善 ~ 検索最適化サービス ~

■ はじめに

https://dk521123.hatenablog.com/entry/2022/12/07/111847

の続き。

Snowflakeで、大きいデータを扱っているのだが、
Selectなどのクエリでパフォーマンスがでないとのこと。

以下の関連記事で扱ったウェアハウスを上げる以外で調べてみたところ、
「検索最適化サービス (Search Optimization Service)」ってのが見つかったので
調べて、まとめてみた。

Snowflake ~ ウェアハウス / Warehouse ~
https://dk521123.hatenablog.com/entry/2022/12/04/000000

目次

【1】検索最適化サービス
【2】使用上の注意
 1)使用エディション
 2)コスト面
 3)データ型
 4)付与できるアクセス権限
【3】検索最適化サービスの使用を決定する上での判断材料
 1)メリットを受けるテーブルの特定
 2)メリットを受けるクエリの特定
【4】検索最適化サービス関連のコマンド文
 1)テーブルが検索最適化用に構成されているかを確認
 2)検索最適化サービスを適用する
 3)テーブルからの検索最適化の削除

【1】検索最適化サービス

* 検索クエリのパフォーマンスを大幅に向上させる機能

https://docs.snowflake.com/ja/user-guide/search-optimization-service

【2】使用上の注意

1)使用エディション

https://docs.snowflake.com/ja/user-guide/search-optimization-service

* Enterprise Edition(またはそれ以上)が必要
 => アップグレードについては、 Snowflakeサポート にお問い合わせ

補足:Snowflake の Edition について
https://docs.snowflake.com/ja/user-guide/intro-editions#overview-of-editions

* Standard Edition
* Enterprise Edition << ここから下のEditionなら使用可能
* Business Critical Edition
* Virtual Private Snowflake(VPS)

確認の仕方

[1] Snowflake の Web UI にログイン
[2] 画面右上の[自分のアカウント名]を選択
[3] 「Account Information」欄の「Edtion」で確認できる

2)コスト面

* サービスのストレージおよびコンピューティングリソースには
 コストがかかることに注意
 => 以下の公式ドキュメントを参照

https://docs.snowflake.com/ja/user-guide/search-optimization-service#label-search-optimization-maintenance-billing

* 特にテーブル内のデータが頻繁に変更される場合、
 検索最適化は維持にコストがかかる可能性がある

https://docs.snowflake.com/ja/sql-reference/sql/alter-table#label-alter-table-searchoptimizationaction-add

コストの見積もり
https://docs.snowflake.com/ja/user-guide/search-optimization-service#estimating-the-costs

* テーブルに検索最適化を追加し、検索最適化のために
 特定の列を構成するためのコストを見積もるには、  
 SYSTEM$ESTIMATE_SEARCH_OPTIMIZATION_COSTS 関数を使用

https://docs.snowflake.com/ja/sql-reference/functions/system_estimate_search_optimization_costs

select SYSTEM$ESTIMATE_SEARCH_OPTIMIZATION_COSTS('sample_table');

<Output>
...
"costPositions" : [
  {
    -- テーブルの検索アクセスパスを構築するための予測コスト
    "name" : "BuildCosts",
    ...
  }, {
    -- テーブルの検索アクセスパスに必要な予測ストレージ容量(単位: TB)
    "name" : "StorageCosts",
    ...
  }, {
    -- 現時点では、このオブジェクトにはコスト情報が含まれない
    "name" : "Benefit",
    ...
  }, {
    -- テーブルの検索アクセスパスを維持するための予測コスト
    "name" : "MaintenanceCosts",
    ...
  }
]
...

3)データ型

* データ型では、サポートしていない型もある

https://docs.snowflake.com/ja/user-guide/search-optimization-service#determining-the-data-types-supported-by-the-search-optimization-service
サポート内のデータ型

* 固定小数点数(例: INTEGER、NUMERIC)
* DATE、 TIME、 TIMESTAMP
* VARCHAR
* BINARY
* VARIANT、 OBJECT、 ARRAY(ただし、プレビュー機能)
* GEOGRAPHY(ただし、プレビュー機能)

サポート外のデータ型

* 上記以外のデータ型 (e.g. 浮動小数点)
 => 将来的には、追加される可能性があり(公式サイトを参照)

4)付与できるアクセス権限

[1] テーブルに対する OWNERSHIP 権限が必要
[2] テーブルを含むスキーマに対する ADD SEARCH OPTIMIZATION 権限が必要

https://docs.snowflake.com/ja/user-guide/search-optimization-service#what-access-control-privileges-are-needed-for-the-search-optimization-service

GRANT ADD SEARCH OPTIMIZATION ON SCHEMA <schema_name> TO ROLE <role>

【3】検索最適化サービスの使用を決定する上での判断材料

* 最終的には、パフォーマンスとコストとの兼ね合いになると思う

1)メリットを受けるテーブルの特定

* プライマリクラスターキー以外の列でテーブルが頻繁にクエリされる場合

https://docs.snowflake.com/ja/user-guide/search-optimization-service#label-search-optimization-service-when-should-you-use-search-paths

2)メリットを受けるクエリの特定

https://docs.snowflake.com/ja/user-guide/search-optimization-service#label-search-optimization-service-queries

* 通常、数秒以上実行されるクエリ
 => 大きいデータが入っているテーブルなら使用価値ありそう

* 以下を使用しているクエリ
 + 等価述語<列名> = <定数> やIN
 + 部分文字列 LIKE および正規表現(ただし、プレビュー機能)
 + VARIANT 列のフィールド(ただし、プレビュー機能)
 + サポートされている述語の接続詞(AND/OR)
 + 地理空間関数 

【4】検索最適化サービス関連のコマンド文

1)テーブルが検索最適化用に構成されているかを確認

https://docs.snowflake.com/ja/user-guide/search-optimization-service#verifying-that-the-table-is-configured-for-search-optimization

-- SEARCH_OPTIMIZATION が ON であることを確認
SHOW TABLES LIKE '%test_table%';

2)検索最適化サービスを適用する

テーブル全体に対する検索最適化の追加
https://docs.snowflake.com/ja/user-guide/search-optimization-service#adding-search-optimization-for-the-entire-table

-- ALTER TABLE ... ADD SEARCH OPTIMIZATION コマンド
alter table test_table add search optimization;

https://docs.snowflake.com/ja/sql-reference/sql/alter-table#label-alter-table-searchoptimizationaction-add

3)テーブルからの検索最適化の削除

ALTER TABLE [IF EXISTS] <table_name> DROP SEARCH OPTIMIZATION;

参考文献

https://dev.classmethod.jp/articles/try-snowflake-search-optimization-service/

関連記事

Snowflake ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2021/11/02/130111
Snowflake ~ 入門編 / Hello world
https://dk521123.hatenablog.com/entry/2021/11/22/212520
Snowflake ~ ウェアハウス / Warehouse ~
https://dk521123.hatenablog.com/entry/2022/12/04/000000
Snowflakeのパフォーマンス改善 ~ データロードの改善 ~
https://dk521123.hatenablog.com/entry/2022/12/07/111847
Snowflakeのパフォーマンス改善 ~ クラスタリングキー ~
https://dk521123.hatenablog.com/entry/2023/03/04/222610