Open9
Snowflake最適化いろいろ
クエリ最適化
- “SELECT *”.は避ける
- 文字列の末尾のワイルドカードは、文字列の先頭のワイルドカードよりも機能する。
- テーブル結合の時のカラムの型は同じにする。
- ORDER BY を使うときは LIMIT を使用する。
SQL ごとのコストの見積もりをする方法
公式ドキュメントにもあった
コスト最適化
- エンタープライズプランではACCESS_HISTORYが見れる。
- 設定が不要なものにはdata_retention_time_in_days=0にしてタイムトラベルを無効にするといい。
- タイムトラベルはデフォルトで有効になっている。
- failsafe機能もコストがかかるので、検証用のものなどはtransient tableにするのがいい。
- 100–250 MB程度のファイルサイズの取り込みがベスト
- warehouseでAUTO_SUSPEND と AUTO_RESUMEを設定する。
- sqlのタイムアウトを設定する
プルーニングとかクラスタリング
コスト最適化
- copyコマンドよりcloneを使った方がストレージを節約できる。
コスト最適化
- auto_suspend=60に設定する。
- バッチ処理はインクリメンタルな形にする。
- マイクロパーティションを意識したクエリを使う。
select * from orders where created_at > '2022/08/14'
- 1つのレコードを更新または削除するたびに、Snowflakeはマイクロパーティション全体を再作成する必要がある。
- 1つのファイルのサイズを 100-250MB程度に抑える。
パフォーマンスとストレージのハック
- transient tableを使う。
- ソートされた状態でデータを取り込む。
- 更新するデータがテーブルの80%以上であれば、非常にコストがかかるので全てのデータを削除して新しいバージョンのテーブルを使ってそこに挿入した方がいい。