【Snowflake】Snowflakeのパフォーマンス改善 ~ データロードの改善 ~

■ はじめに

https://dk521123.hatenablog.com/entry/2021/11/15/221245

の続き。

データロードが時間が掛かるので、
データロードのパフォーマンスについて調べてみた。

目次

【0】データロードのパフォーマンス
 補足:公式ドキュメントより
【1】ウェアハウス
【2】ロードするファイルについて
 1)ファイルサイズ
 2)ファイル数
 3)パス (パーティション分割)

【0】データロードのパフォーマンス

https://docs.snowflake.com/ja/user-guide/data-load-considerations.html

を一読しておくといいかも。

https://docs.snowflake.com/ja/user-guide/warehouses-overview.html#impact-on-data-loading

を読んだ方がいいが、まとめると以下の通り。
~~~~~~~~~
[a] ウェアハウスのサイズ変更
 => ただし、ウェアハウスのサイズを大きくしたら必ず速度が速くなる訳ではない

[b] 取り込むファイルサイズの統一(100~250 MBまたはそれ以上)かつ
 できる限りファイル数を少なくする
 => 取り込むファイルの数(および各ファイルのサイズ)の影響を受ける
 => ただし、1ファイルで大きいファイル(例えば100GB)は、NG
~~~~~~~~~

補足:公式ドキュメントより

https://docs.snowflake.com/ja/user-guide/warehouses-overview.html#impact-on-data-loading

より抜粋
~~~~~~~~
ウェアハウスのサイズを大きくしても、
データロードのパフォーマンスが常に向上するわけでは ありません 。
データロードのパフォーマンスは、ウェアハウスのサイズよりも、
ロードされるファイルの数(および各ファイルのサイズ)の影響を受けます。

[ちなみに]
大量のファイル(つまり、数百または数千のファイル)を
同時に一括ロードする場合を除き、
通常は、より小さなウェアハウス(小、中、大)で十分です。
より大きなウェアハウス(XL、2XLなど)を使用すると、
より多くのクレジットが消費され、パフォーマンスの向上が
みられない場合があります。
~~~~~~~~

【1】ウェアハウス

* Snowflakeの負荷監視チャート「Warehouse Load Over Time」などで
 ウェアハウスがボトルネックとなっているかを確認した上で
 ウェアハウスのサイズやクラスター数をあげるか検討するといい
 => 負荷監視チャートについては、以下の関連記事を参照のこと

Snowflake ~ ウェアハウス負荷監視 ~
https://dk521123.hatenablog.com/entry/2022/12/06/191727

* ウェアハウスのサイズ変更方法 については、以下の関連記事を参照のこと

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

【2】ロードするファイルについて

1)ファイルサイズ

https://docs.snowflake.com/ja/user-guide/data-load-considerations-prepare.html#general-file-sizing-recommendations

* ファイルサイズは、一律、およそ100から250 MB(またはそれ以上)が推奨
 => ロードの並列操作の数を最適化するため
 => 例えば、同じパス内に2KB、10GBのファイルがあり、2並列で実行した場合、
  2KBはすぐに終わるが、10GBがボトルネックになる
  それよりもファイルサイズを一律にする方がリソースを有効活用できる

* 以下の公式ドキュメントにも同じようなことが記載。

https://docs.snowflake.com/ja/user-guide/warehouses-overview.html#impact-on-data-loading

注意:「またはそれ以上」について

* 非常に大きなファイル(例: 100 GB 以上)をロードすることは非推奨

https://docs.snowflake.com/ja/user-guide/data-load-considerations-prepare.html#general-file-sizing-recommendations

より抜粋
~~~~~~~~~~~~~~~~~~~~
注釈
非常に大きなファイル(例: 100 GB 以上)をロードすることはお勧めしません。

大きなファイルをロードする必要がある場合は、 
ON_ERROR コピーオプションの値を慎重に検討してください。
少数のエラーでファイルを中止またはスキップすると、遅延が発生し、
クレジットが無駄になる可能性があります。
さらに、データのロード操作が最大許容時間の24時間を超えて継続した場合は、
ファイルの一部がコミットされずに中止される可能性があります。
~~~~~~~~~~~~~~~~~~~~

2)ファイル数

https://docs.snowflake.com/ja/user-guide/data-load-considerations-manage.html#partitioning-staged-data-files

より抜粋
~~~~~~
S3は、Snowflakeが使用する COPY ステートメントごとに
ディレクトリリストを送信するため、
各ディレクトリ内のファイル数を減らすと、
COPY ステートメントのパフォーマンスが向上します。
1時間ごとに、フォルダー内に10-15分単位のサブフォルダーを
作成することも検討できます。
~~~~~~
 => 「1)ファイルサイズ」を踏まえるとファイルサイズを一律に
  できればファイル数が少ない方がいいってこと?

3)パス (パーティション分割)

パーティション分割しておくことを推奨
 => 下記は、運用的な側面で、
  Snowflake内部としてはパーティションしようとしまいと
  パフォーマンスには影響しない?

理由
https://docs.snowflake.com/ja/user-guide/data-load-considerations-stage.html#organizing-data-by-path

より抜粋
~~~~~~~~~
 パスごとにデータファイルを整理すると、
1つのコマンドで分割データの一部をSnowflakeにコピーできます。
 並列操作を利用して、ファイルのサブセットに
一致する COPY ステートメントを同時に実行できます。
~~~~~~~~~

https://docs.snowflake.com/ja/user-guide/data-load-considerations-manage.html#partitioning-staged-data-files

にも以下の記載あり。
~~~~~
内部(つまり、Snowflake)ステージまたは
外部の場所(S3バケットまたはAzureコンテナー)において、
論理的で詳細なパスを使用してデータをパーティションすることが重要です
~~~~~

関連記事

Snowflake ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2021/11/02/130111
Snowflake ~ 基本編 / ステージ ~
https://dk521123.hatenablog.com/entry/2022/09/01/220643
Snowflake ~ 基本編 / データロード ~
https://dk521123.hatenablog.com/entry/2021/11/15/221245
Snowflake ~ Snowpipe ~
https://dk521123.hatenablog.com/entry/2023/04/15/225515
Snowflake ~ ウェアハウス / Warehouse ~
https://dk521123.hatenablog.com/entry/2022/12/04/000000
Snowflake ~ ウェアハウス負荷監視 ~
https://dk521123.hatenablog.com/entry/2022/12/06/191727
Snowflake ~ ネットワークポリシー ~
https://dk521123.hatenablog.com/entry/2022/12/08/120131
Snowflake ~ クエリの中断 ~
https://dk521123.hatenablog.com/entry/2022/12/09/152837
Snowflakeのパフォーマンス改善 ~ 検索最適化サービス ~
https://dk521123.hatenablog.com/entry/2023/02/27/120943
Snowflakeのパフォーマンス改善 ~ クラスタリングキー ~
https://dk521123.hatenablog.com/entry/2023/03/04/222610