この記事について
Snowflake は「クラウドのために一から設計された DWH」である。この記事では Snowflake の3層アーキテクチャ、マイクロパーティション、クエリ処理の仕組みを解説する。
1. 3層アーキテクチャ
1-1. 全体像
┌─────────────────────────────────────────────────┐
│ Cloud Services Layer │
│ │
│ 認証・認可 メタデータ管理 クエリ最適化 │
│ トランザクション管理 インフラ管理 │
│ 結果キャッシュ セキュリティ │
└──────────────────┬──────────────────────────────┘
│
┌──────────────────┴──────────────────────────────┐
│ Virtual Warehouse Layer │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ WH: XS │ │ WH: L │ │ WH: XL │ │
│ │ BI用 │ │ ETL用 │ │ DS用 │ │
│ │ │ │ │ │ │ │
│ │ 1ノード │ │ 8ノード │ │ 16ノード │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ ← 各 Warehouse は完全に独立 → │
└──────────────────┬──────────────────────────────┘
│
┌──────────────────┴──────────────────────────────┐
│ Storage Layer │
│ │
│ クラウドオブジェクトストレージ(S3 / Azure Blob / GCS)│
│ マイクロパーティション(圧縮・列指向・不変) │
│ ← すべての Warehouse が同じデータにアクセス → │
└─────────────────────────────────────────────────┘
1-2. 各層の役割
| 層 | 役割 | 特徴 |
|---|---|---|
| Cloud Services | 頭脳。メタデータ、最適化、セキュリティ | 常時稼働。Snowflake が管理 |
| Virtual Warehouse | 筋肉。クエリの実行 | オンデマンド起動・停止。ユーザーが制御 |
| Storage | 記憶。データの永続化 | クラウドストレージ。コンピュートと完全分離 |
1-3. なぜ3層分離が重要か
従来の DWH(Redshift Provisioned):
コンピュート + ストレージが結合
→ ストレージを増やすにはノードを追加 → コンピュートも増える → コスト増
→ コンピュートを増やすにはノードを追加 → ストレージも増える → コスト増
Snowflake:
ストレージを増やす → データを入れるだけ(コンピュートに影響なし)
コンピュートを増やす → Warehouse サイズを変更(ストレージに影響なし)
→ 必要なものだけスケール
2. マイクロパーティション
2-1. 基本構造
Snowflake はテーブルのデータを自動的にマイクロパーティションに分割する。
テーブル: sales(1億行)
│
├── マイクロパーティション 1(50〜500MB、圧縮後 16MB 程度)
│ ├── Column: order_id [1, 2, 3, ..., 50000]
│ ├── Column: date [2024-01-01, ..., 2024-01-15]
│ ├── Column: amount [100, 250, ..., 9999]
│ └── Column: region [東京, 大阪, ..., 福岡]
│
├── マイクロパーティション 2
│ ├── Column: order_id [50001, ..., 100000]
│ ├── ...
│
└── ... (数千〜数百万パーティション)
特徴: – 列指向で格納(必要なカラムだけ読み取り) – 自動的に圧縮 – 不変(Immutable):更新は新しいパーティションを作成し、古いものを論理削除 – ユーザーが設計する必要なし(自動分割)
2-2. メタデータとプルーニング
各マイクロパーティションのメタデータを Cloud Services Layer が管理する。
マイクロパーティション 1 のメタデータ:
date: min=2024-01-01, max=2024-01-15
amount: min=100, max=9999
region: distinct_values=[東京, 大阪, 名古屋, 福岡]
rows: 50000
クエリ実行時にメタデータを使って不要なパーティションをスキップする(パーティションプルーニング)。
SELECT * FROM sales WHERE date = '2024-04-01';
-- Cloud Services が判定:
-- パーティション 1: date min=01-01, max=01-15 → スキップ
-- パーティション 2: date min=01-16, max=01-31 → スキップ
-- ...
-- パーティション 91: date min=04-01, max=04-15 → 読み取り ✓
-- → 全パーティションの1%だけ読む2-3. Redshift / Databricks との比較
| 観点 | Snowflake | Redshift | Databricks (Delta Lake) |
|---|---|---|---|
| パーティション | 自動(マイクロパーティション) | 手動(Distribution + Sort Key) | 手動(partitionBy)+ 自動(Liquid Clustering) |
| プルーニング | メタデータベース(自動) | Zone Map + Sort Key | Delta 統計情報 |
| ユーザーの設計 | 不要 | 必要(Key 選択が性能に直結) | 必要(パーティションキー選択) |
| チューニング | ほぼ不要 | 必要 | 必要(OPTIMIZE, Z-ORDER) |
Snowflake の「チューニング不要」は、マイクロパーティションの自動管理によるもの。
3. Virtual Warehouse
3-1. サイズと構成
| サイズ | ノード数 | クレジット/時間 | 用途 |
|---|---|---|---|
| X-Small | 1 | 1 | 軽い BI クエリ |
| Small | 2 | 2 | 通常の分析 |
| Medium | 4 | 4 | 中規模 ETL |
| Large | 8 | 8 | 大規模 ETL |
| X-Large | 16 | 16 | 重い分析 |
| 2XL | 32 | 32 | 大規模処理 |
| 3XL | 64 | 64 | 非常に大規模 |
| 4XL | 128 | 128 | 最大規模 |
サイズを1段階上げるとノード数が2倍になり、理論上の処理速度も2倍になる。
3-2. マルチクラスタ Warehouse
同時実行が増えたときに自動的にクラスタを追加する。
通常時:
Warehouse "analytics" → Cluster 1(1つだけ稼働)
同時クエリが増加:
Warehouse "analytics" → Cluster 1
→ Cluster 2(自動追加)
→ Cluster 3(自動追加)
負荷が下がる:
Warehouse "analytics" → Cluster 1(2, 3 は自動停止)
設定: – 最小クラスタ数(常時稼働) – 最大クラスタ数(スケールアウト上限) – スケーリングポリシー(Standard / Economy)
3-3. 自動サスペンドと自動レジューム
クエリなし → 5分後に自動サスペンド(コスト $0)
クエリ到着 → 自動レジューム(数秒で起動)
4. クエリ処理の流れ
1. ユーザーが SQL を投入
│
2. Cloud Services Layer
├── SQL パース・検証
├── メタデータからプルーニング対象を決定
├── 結果キャッシュを確認(同じクエリが過去にあれば即返却)
└── 実行計画を生成
│
3. Virtual Warehouse
├── 必要なマイクロパーティションを Storage から読み取り
├── ローカル SSD キャッシュを確認(あればキャッシュから読む)
├── クエリを実行(MPP で並列処理)
└── 結果を返却
│
4. 結果をユーザーに返す
└── 結果を Cloud Services の結果キャッシュに保存(24時間)
4-1. 3層のキャッシュ
| キャッシュ | 層 | 保持期間 | 説明 |
|---|---|---|---|
| 結果キャッシュ | Cloud Services | 24時間 | 同じクエリの結果を即返却。Warehouse 不要(コスト $0) |
| ローカルディスクキャッシュ | Virtual Warehouse | Warehouse 稼働中 | 読み取ったデータを SSD にキャッシュ |
| メタデータキャッシュ | Cloud Services | 常時 | パーティションの min/max 等 |
結果キャッシュが効くと、Warehouse を起動せずに結果を返せる。クレジット消費ゼロ。
5. データの更新(Copy-on-Write)
Snowflake のマイクロパーティションは不変。更新は「新しいパーティションを作って古いものを論理削除」する。
UPDATE sales SET amount = 500 WHERE order_id = 42;
Before:
パーティション A: [order_id=42, amount=100], [order_id=43, amount=200], ...
After:
パーティション A: 論理削除(タイムトラベルで参照可能)
パーティション A': [order_id=42, amount=500], [order_id=43, amount=200], ...
← 変更された行を含むパーティション全体を書き直す
この仕組みにより: – タイムトラベルが可能(古いパーティションが残っている) – 読み取りと書き込みが干渉しない(MVCC) – VACUUM が不要(Snowflake が自動的に古いパーティションを回収)
6. Clustering Key
マイクロパーティションは自動分割だが、データの物理的な並び順を指定したい場合に Clustering Key を設定できる。
-- date でクラスタリング
ALTER TABLE sales CLUSTER BY (date);| Clustering Key なし | Clustering Key あり | |
|---|---|---|
| パーティション内のデータ | 挿入順 | 指定キーでソート済み |
| プルーニング効率 | データ分布に依存 | 高い(min/max の範囲が狭い) |
| 自動メンテナンス | 不要 | Snowflake が自動的に再クラスタリング |
| コスト | なし | 再クラスタリングにクレジット消費 |
Clustering Key は Redshift の Sort Key に相当するが、メンテナンスが自動である点が異なる。
必要なケース: – TB級の大きなテーブル – 特定カラムでのフィルタが非常に多い – プルーニング効率が悪い(SYSTEM$CLUSTERING_INFORMATION で確認)
7. まとめ
| 概念 | 要点 |
|---|---|
| 3層アーキテクチャ | Cloud Services(頭脳)+ Virtual Warehouse(筋肉)+ Storage(記憶) |
| マイクロパーティション | 自動分割、列指向、不変。チューニング不要の源泉 |
| Virtual Warehouse | 独立したコンピュート。瞬時スケーリング、自動サスペンド |
| 3層キャッシュ | 結果キャッシュ($0)、ローカルSSD、メタデータ |
| Copy-on-Write | 更新はパーティション書き直し。タイムトラベルと MVCC を実現 |
| Clustering Key | 大規模テーブルのプルーニング最適化。自動メンテナンス |
参考文献
- Snowflake. “Key Concepts & Architecture.” https://docs.snowflake.com/en/user-guide/intro-key-concepts
- Snowflake. “Micro-partitions & Data Clustering.” https://docs.snowflake.com/en/user-guide/tables-clustering-micropartitions
- Dageville et al. “The Snowflake Elastic Data Warehouse.” SIGMOD, 2016.