Snowflake

Clustering Keysとは?マイクロパーティション最適化

2026-03-21
更新: 2026-03-27
NicheeLab編集部

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)'
);

system$clustering_information() の出力項目

項目説明
cluster_by_keys評価対象のクラスタリングキー
total_partition_countテーブル全体のマイクロパーティション数
total_constant_partition_count指定列の値が1つだけのパーティション数(最もプルーニング効率が高い)
average_overlapsパーティション間の値範囲のオーバーラップ平均(小さいほど良い)
average_depthクラスタリング深度の平均(小さいほど良い)

Clustering Keysの定義と変更

-- テーブル作成時に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列以上(メンテナンスコスト増大)
列の順序カーディナリティが低い列を先に配置カーディナリティが高い列を先に配置

Automatic Clustering

Clustering Keysを定義すると、SnowflakeのAutomatic ClusteringサービスがCloud Services Layer上で自動的にリクラスタリングを実行します。ユーザーのWarehouseを消費せず、Serverless Creditとして課金されます。

  • DML操作後にクラスタリング状態を自動的に監視・維持
  • 手動でのリクラスタリング実行は不要
  • テーブルごとにAutomatic Clusteringを一時停止・再開可能
-- 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でコスト監視

ベストプラクティス

  • まずQuery Profileで診断:パーティションプルーニングの状況を確認し、改善の余地がある場合のみClustering Keysを検討する
  • 時系列データの自然クラスタリングを活かす:INSERT順が時系列順のテーブルは日付列のクラスタリングが自然に維持されるため、追加設定が不要な場合がある
  • 定期的なコスト監視:AUTOMATIC_CLUSTERING_HISTORYでクレジット消費を追跡し、費用対効果を検証する
  • 式ベースのClustering Keys:TO_DATE(timestamp_col) や MONTH(order_date) のように式を使って、高カーディナリティ列のカーディナリティを下げてから指定する手法も有効

問題で確認

Performance Optimization

問題 1

Enterprise Editionで50億行のトランザクションテーブルのクエリが遅い。Query Profileで確認するとWHERE句のorder_date範囲フィルタに対してパーティションプルーニングがほとんど効いていない。最も適切な対処はどれか。

  1. Virtual Warehouseのサイズを6XLに拡大してスキャン速度を上げる
  2. ALTER TABLE ... CLUSTER BY (order_date) を実行してAutomatic Clusteringでデータの物理配置を最適化する
  3. Materialized Viewを作成してクエリ結果をキャッシュする
  4. DATA_RETENTION_TIME_IN_DAYSを90日に設定してTime Travel用の領域を確保する

正解: 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のメンテナンスコストに見合う改善が得られません。日付列やカテゴリ列のようにカーディナリティが中程度の列が最も効果的です。

この記事で学んだ内容を問題で確認しましょう

16,000問以上の問題で実力チェック

無料で問題を解いてみる
この記事の著者

NicheeLab編集部

データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。


関連記事
Snowflake

Snowflake資格一覧|全11試験(SnowPro)の難易度・費用

Snowflake認定資格(SnowPro)全11試験の一覧・難易度・費用・出題範囲を徹底解説。...

Snowflake

Snowflake試験の難易度ランキング|全11資格を徹底比較

Snowflake(SnowPro)認定全11試験の難易度をランキング形式で比較。学習時間・合格に必要なスキルから分析。...

Snowflake

Snowflake資格の勉強方法|効率的な学習ルートと合格のコツ

Snowflake認定資格(SnowPro)に最短で合格するための勉強方法。公式リソース・学習スケジュールを徹底ガイド。...

Snowflake

SnowPro Core試験完全解説|出題範囲・問題例・合格戦略

SnowPro Core Certification(COF-C03)を徹底解説。出題範囲・100問の試験形式・合格ライ...

Snowflake

SnowPro Platform Associate完全解説|入門試験の攻略

SnowPro Associate: Platform Certification(SOL-C01)を徹底解説。最も簡単...

Snowflakeの記事一覧 (102件)
© 2026 NicheeLab All rights reserved.