❄️

Snowflakeのクラスタリングキーについて理解を深める

2023/08/14に公開

概要

Snowflakeはパーティションキーやインデックスなど物理設計をせずとも高速に動作します。「クエリの実行時間が遅い・・・」と思った場合は使用するウェアハウスサイズを上げることで解決する場合が多いです。
Snowflakeにてクエリ実行時の検索範囲をスキップするには、クラスタリングキーをテーブルに設定し、マイクロパーティションを有効化することが出来ます。

3行まとめ
・Snowflakeのテーブルをチューニングしたい方
・マイクロパーティション(クラスタリングキー)を使用してみたいけどどれくらいなのかが知りたい方
向けに調査結果を紹介している記事です。皆様の参考になれば幸いです。

クラスタリングキーとは何ですか?

利用するデータ

SNOWFLAKE_SAMPLE_DATA.TPCH_SF_1000.LINEITEM

検証用テーブルの作成

CREATE OR REPLACE TABLE C_LINEITEM CLONE LINEITEM;

テーブルの行数、約200億行
データサイズ、約1TB
テーブル構造、TIMESTAMP,VARCHAR,VARCHAR,NUMBER...

実行パターン 実行時間
クラスタリングキー未設定 18秒
DATE列に設定 1秒
DATE列を含む複数列に設定 1.6秒

テーブルに対して設定する場合は、複数の日付列を指定するのが良いと記載があります。この場合は日付列はTIMESTAMP型の場合はTO_DATEでキャストすることを推奨されています。

例えば、ファクトテーブルに、多くの離散値(テーブル内のマイクロパーティションの数よりも多く)を含む TIMESTAMP 列 c_timestamp がある場合、タイムスタンプではなく日付に値をキャストすることで、列にクラスタリングキーを定義できます(例: to_date(c_timestamp))。これにより、カーディナリティが合計日数に削減され、より優れたプルーニング結果が通常生成されます。

引用元:クラスタリングキーを選択するための戦略

費用

今回の例では、DATE列に指定した場合は約5クレジット、DATE列を含む4列に指定した場合は22クレジットの消費でした。

自動クラスタリング

クラスタリングキーを設定しクラスタ化されたテーブルはSnowflakeが継続的に管理します。
再クラスタリングはすぐに実行されず、恩恵が受けると判断された場合に実行されます。

自動クラスタリングのクレジット使用、請求については最適なリソース量を判断し実行されるためコントロールができない状況となっています。

予期せぬ請求を防ぐためまずは、1つのテーブルで設定を行い費用の確認をすることが推奨されています。

重要
クラスタ化されたテーブルで自動クラスタリングを有効化または再開した後、テーブルが再クラスタ化されてからしばらく経っている場合、Snowflakeがテーブルを最適なクラスタ化状態にするため、再クラスタリングアクティビティ(および対応するクレジット料金)が発生する可能性があります。テーブルが最適にクラスタ化されると、再クラスタリングアクティビティは終了します。
同様に、既存のテーブルでクラスタリングキーを定義するか、クラスタ化されたテーブルでクラスタリングキーを変更すると、再クラスタリングとクレジット料金をトリガーする場合があります。
予期しないクレジット請求を防ぐために、選択した1つまたは2つのテーブルから開始し、 DML の実行時にテーブルを適切にクラスタ化することに関連するクレジット請求を確認することをお勧めします。これは、アクティビティの再クラスタリングによって消費されるクレジット数のベースラインを確立するのに役立ちます。

自動クラスタリング

最大の恩恵を得るには

データが頻繁に更新されるテーブルは自動クラスタリングが実行され、コストがかかります。
レコード数が多く、頻繁に参照され、あまりデータが更新されないようなテーブルに設定するのが向いています。
また、(INSERT、DELETE、UPDATE)が多く発生するテーブルをクラスター化する場合は、
バッチなどのまとまった処理にまとめ、実行頻度を低くすることを検討するのを推奨されています。

メリット

・クエリの実行時間の性能向上を期待できる
・設定後のメンテナンスは不要
・必要に応じて再クラスタリングが実施される
・従来のパーティションとは異なり、自動的にパーティショニングされる

デメリット

・クラスタリングの処理時のリソース配分が設定できない
・そのため大量のリソースが使用されコストが高くなる可能性がある
・頻繁に更新されるテーブルには不向き

サンプル

重要な使用上の注意
VARCHAR列に設定する場合は最初の5バイトのみを使用されます。
そのため、SUBSTRING関数を用いて共通化する文字を参照しない設定を推奨しています。

create or replace table t1(vc varchar) cluster by (SUBSTRING(vc, 5, 5));

テーブル作成時に設定する場合

CREATE TABLE <name> ... CLUSTER BY ( <expr1> [ , <expr2> ... ] )

既存のテーブルに設定する場合

ALTER TABLE <name> CLUSTER BY ( <expr1> [ , <expr2> ... ] )

クラスタリングキーを削除する

ALTER TABLE <name> DROP CLUSTERING KEY

自動クラスタリングの一時停止

ALTER TABLE <name> SUSPEND RECLUSTER;

自動クラスタリングの再開

ALTER TABLE <name> RESUME RECLUSTER;

テーブルの状況確認

SHOW TABLES LIKE <name>;

自動クラスタリングのコストの表示

適切な権限が必要(ACCOUNTADMINなど)
過去30日間のクレジット量を表示する

SELECT TO_DATE(start_time) AS date,
  database_name,
  schema_name,
  table_name,
  SUM(credits_used) AS credits_used
FROM snowflake.account_usage.automatic_clustering_history
WHERE start_time >= DATEADD(month,-1,CURRENT_TIMESTAMP())
GROUP BY 1,2,3,4
ORDER BY 5 DESC;

※クラスタリングが実行されてからしばらくすると反映されます。

Discussion