Clustering Keys(クラスタリングキー)は、Snowflakeの大規模テーブルでパーティションプルーニングの精度を最大化するためのパフォーマンスチューニング機能です。指定した列に基づいてデータの物理的な配置(マイクロパーティション内のソート順)を最適化し、クエリのスキャン量を大幅に削減します。Enterprise Edition以上で利用可能です。
Snowflakeは全テーブルのデータを50〜500MBの圧縮されたマイクロパーティションに自動分割して格納します。各マイクロパーティションは列指向形式で保存され、各列の最小値・最大値・NULL数などのメタデータがCloud Services Layerに記録されます。
クエリにWHERE句が含まれると、Snowflakeはメタデータを参照して条件に合致する可能性のないマイクロパーティションをスキャン対象から除外します。この仕組みがパーティションプルーニングです。データが物理的にソートされているほどプルーニングの精度が高くなり、スキャン量が減少します。
データが挿入された順序で自然にソートされている場合(例:タイムスタンプ列で時系列INSERTされる場合)、そのテーブルは自然にクラスタリングされた状態です。この場合、追加のClustering Keys設定は不要です。
クラスタリング深度(Clustering Depth)は、テーブルの物理的なデータ配置がどの程度整理されているかを示す指標です。値が小さいほどデータが整理されており、プルーニングが効率的に機能します。
-- 特定列のクラスタリング深度を確認
SELECT SYSTEM$CLUSTERING_DEPTH(
'analytics.orders',
'(order_date, region)'
);
-- クラスタリングの詳細情報を取得
SELECT SYSTEM$CLUSTERING_INFORMATION(
'analytics.orders',
'(order_date, region)'
);| 項目 | 説明 |
|---|---|
| cluster_by_keys | 評価対象のクラスタリングキー |
| total_partition_count | テーブル全体のマイクロパーティション数 |
| total_constant_partition_count | 指定列の値が1つだけのパーティション数(最もプルーニング効率が高い) |
| average_overlaps | パーティション間の値範囲のオーバーラップ平均(小さいほど良い) |
| average_depth | クラスタリング深度の平均(小さいほど良い) |
-- テーブル作成時にClustering Keysを指定
CREATE TABLE analytics.orders (
order_id INT,
order_date DATE,
region VARCHAR(50),
customer_id INT,
amount NUMBER(12,2)
)
CLUSTER BY (order_date, region);
-- 既存テーブルにClustering Keysを追加
ALTER TABLE analytics.orders
CLUSTER BY (order_date, region);
-- Clustering Keysの変更(上書き)
ALTER TABLE analytics.orders
CLUSTER BY (order_date, customer_id);
-- Clustering Keysの削除(Automatic Clusteringも停止)
ALTER TABLE analytics.orders DROP CLUSTERING KEY;| 選定基準 | 推奨 | 非推奨 |
|---|---|---|
| フィルタ頻度 | WHERE句で頻繁に使われる列 | ほとんどフィルタされない列 |
| カーディナリティ | 中程度(日付・カテゴリ・リージョン) | 極端に高い(UUID)/ 極端に低い(BOOLEAN) |
| 列数 | 2〜4列 | 5列以上(メンテナンスコスト増大) |
| 列の順序 | カーディナリティが低い列を先に配置 | カーディナリティが高い列を先に配置 |
Clustering Keysを定義すると、SnowflakeのAutomatic ClusteringサービスがCloud Services Layer上で自動的にリクラスタリングを実行します。ユーザーのWarehouseを消費せず、Serverless Creditとして課金されます。
-- Automatic Clusteringを一時停止
ALTER TABLE analytics.orders SUSPEND RECLUSTER;
-- Automatic Clusteringを再開
ALTER TABLE analytics.orders RESUME RECLUSTER;-- Automatic Clusteringのクレジット消費履歴(直近7日間)
SELECT *
FROM TABLE(INFORMATION_SCHEMA.AUTOMATIC_CLUSTERING_HISTORY(
DATE_RANGE_START => DATEADD(DAY, -7, CURRENT_DATE()),
DATE_RANGE_END => CURRENT_DATE(),
TABLE_NAME => 'ANALYTICS.ORDERS'
));
-- Account Usageビューで長期的なコストトレンドを分析
SELECT
table_name,
SUM(credits_used) AS total_credits,
SUM(num_bytes_reclustered) AS total_bytes_reclustered
FROM SNOWFLAKE.ACCOUNT_USAGE.AUTOMATIC_CLUSTERING_HISTORY
WHERE start_time >= DATEADD(MONTH, -1, CURRENT_TIMESTAMP())
GROUP BY table_name
ORDER BY total_credits DESC;テーブルサイズは数十億行以上か?
├─ NO → Clustering Keys不要(自然なプルーニングで十分)
└─ YES
↓
Query Profileでパーティションプルーニングの効率を確認
↓
スキャンされたパーティション数が総数に比べて多いか?
├─ NO → 自然クラスタリングが効いている → Clustering Keys不要
└─ YES
↓
WHERE句で頻繁にフィルタされる列を2〜4列選定
↓
ALTER TABLE ... CLUSTER BY で定義
↓
AUTOMATIC_CLUSTERING_HISTORYでコスト監視Performance Optimization
問題 1
Enterprise Editionで50億行のトランザクションテーブルのクエリが遅い。Query Profileで確認するとWHERE句のorder_date範囲フィルタに対してパーティションプルーニングがほとんど効いていない。最も適切な対処はどれか。
正解: B
パーティションプルーニングが効いていない原因は、order_date列のデータがマイクロパーティション間でばらばらに配置されていることです。CLUSTER BY (order_date) を設定すると、Automatic Clusteringがデータを物理的に再配置し、日付範囲フィルタのプルーニング精度が飛躍的に向上します。Warehouseサイズの拡大はスキャン速度を上げますが根本的な解決にはなりません。Time Travelの設定はデータ保護機能であり、クエリパフォーマンスには影響しません。
Clustering Keysを設定するとAutomatic Clusteringのコストはどの程度かかりますか?
Automatic ClusteringのコストはServerless Creditとして課金され、テーブルへのDML操作(INSERT/UPDATE/DELETE/MERGE)の頻度とデータ量に比例します。頻繁に更新されるテーブルほどリクラスタリングの頻度が高くなりコストが増大します。AUTOMATIC_CLUSTERING_HISTORYテーブル関数でクレジット消費履歴を確認でき、想定以上のコストが発生している場合はClustering Keysの列数を減らすか、Clustering Keysの削除(ALTER TABLE t DROP CLUSTERING KEY)を検討します。
Clustering Keysと Search Optimization Serviceの違いは何ですか?
Clustering Keysはデータの物理的な配置を制御してパーティションプルーニングを改善する機能で、範囲フィルタ(BETWEEN・>=・<=)や等値フィルタに有効です。一方Search Optimization Serviceは、等値検索(= / IN)やVARIANTパスの検索、GEOGRAPHY関数の検索を高速化する補助的なアクセス構造を構築します。両者は併用可能で、ワークロードの特性に応じて使い分けます。
Clustering Keysの列にカーディナリティが高い列を選んではいけない理由は?
UUIDやランダムIDのようにカーディナリティが極端に高い列をClustering Keyに指定すると、各マイクロパーティション内の最小値・最大値の範囲が狭くなりすぎ、パーティション間で値の重複(オーバーラップ)がほとんどなくなります。一見良さそうに見えますが、実際にはその列でのフィルタリングはピンポイントなので元々プルーニングが効きやすく、Clustering Keysのメンテナンスコストに見合う改善が得られません。日付列やカテゴリ列のようにカーディナリティが中程度の列が最も効果的です。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Snowflake資格一覧|全11試験(SnowPro)の難易度・費用
Snowflake認定資格(SnowPro)全11試験の一覧・難易度・費用・出題範囲を徹底解説。...
Snowflake試験の難易度ランキング|全11資格を徹底比較
Snowflake(SnowPro)認定全11試験の難易度をランキング形式で比較。学習時間・合格に必要なスキルから分析。...
Snowflake資格の勉強方法|効率的な学習ルートと合格のコツ
Snowflake認定資格(SnowPro)に最短で合格するための勉強方法。公式リソース・学習スケジュールを徹底ガイド。...
SnowPro Core試験完全解説|出題範囲・問題例・合格戦略
SnowPro Core Certification(COF-C03)を徹底解説。出題範囲・100問の試験形式・合格ライ...
SnowPro Platform Associate完全解説|入門試験の攻略
SnowPro Associate: Platform Certification(SOL-C01)を徹底解説。最も簡単...