はじめに
Snowflake の利用明細を見ると、ウェアハウスのコンピュートとは別に「クラウドサービス(Cloud Services)」というクレジット消費が記録されている。これが何者で、どういう条件で課金され、どう追跡・削減するかを整理する。
公式ドキュメント: Understanding compute cost / Optimizing cloud services for cost
クラウドサービスレイヤーとは
Snowflake のアーキテクチャは大きく3層に分かれる。
┌────────────────────────────────────────────┐
│ Cloud Services Layer │ ← 今回の対象
│ 認証 / メタデータ管理 / クエリコンパイル │
│ アクセス制御 / トランザクション管理 │
├────────────────────────────────────────────┤
│ Compute Layer(仮想ウェアハウス) │ ← クエリ・DML実行
├────────────────────────────────────────────┤
│ Storage Layer │ ← データ永続化
└────────────────────────────────────────────┘
クラウドサービスレイヤーは、ユーザーが明示的にウェアハウスを起動しなくても、Snowflake が内部的に常時稼働させているコンポーネントになる。主な役割は以下のとおり。
| 機能 | 内容 |
|---|---|
| 認証・認可 | ログイン検証、ロール解決、行ポリシー評価 |
| メタデータ管理 | テーブル定義、パーティション情報、統計情報の管理 |
| クエリコンパイル | SQL のパース、最適化プラン生成、プルーニング |
| トランザクション管理 | ACID 保証、スナップショット管理 |
10%ルール(Cloud Services Adjustment)
課金の仕組み
クラウドサービスのクレジット消費は常に発生するが、課金(請求)されるのは一定の条件を超えた場合のみとなる。
1日(UTC)のクラウドサービス消費量が、同日の仮想ウェアハウス消費量の10%を超えた場合のみ、超過分が課金される。
超過分のみが課金される仕組みを「Cloud Services Adjustment(調整)」と呼ぶ。METERING_DAILY_HISTORY ビューの CREDITS_ADJUSTMENT_CLOUD_SERVICES 列が負の値で記録され、その分だけ差し引かれる。
計算例
公式ドキュメントの具体例を以下に示す。
| 日付 | VW使用クレジット | CS使用クレジット | 調整額(10%以下は全額控除) | 課金クレジット |
|---|---|---|---|---|
| Nov 1 | 100 | 20 | −10 | 110 |
| Nov 2 | 120 | 10 | −10 | 120 |
| Nov 3 | 80 | 5 | −5 | 80 |
| Nov 4 | 100 | 13 | −10 | 103 |
| 合計 | 400 | 48 | −35 | 413 |
- Nov 1: CS=20 > VW×10%=10 → 超過10クレジット分が課金。調整額は −10
- Nov 2: CS=10 < VW×10%=12 → CS が10%未満 → 調整額は −10(CS全額控除)
- Nov 3: CS=5 < VW×10%=8 → 全額調整。調整額は −5(CS全額控除)
- Nov 4: CS=13 > VW×10%=10 → 超過3クレジット分が課金。調整額は −10
クラウドサービス費用が発生するユースケース
以下のいずれも、仮想ウェアハウスを使わずにクラウドサービスのみでリソースを消費するパターンになる。
| パターン | 発生原因 | 推奨対策 |
|---|---|---|
| COPYコマンドの低選択性 | S3ファイル一覧取得はCSのみで実行 | S3バケットに日付プレフィックスを付与し、対象ファイルを絞る |
| 高頻度DDL・クローニング | CREATE/DROP/CLONE はメタデータ操作のみ | クローンの粒度を見直す(スキーマ全体→テーブル単位へ) |
| 高頻度の単純クエリ | SELECT 1、SELECT CURRENT_SESSION() の大量実行 |
JDBC ドライバの getSessionId() メソッドを使ってキャッシュ活用 |
| INFORMATION_SCHEMA の高頻度クエリ | I_Sクエリはウェアハウス不使用 | ACCOUNT_USAGE スキーマへ切り替える |
| 高頻度SHOWコマンド | アプリ・サードパーティツールがメタデータを頻繁に取得 | ツール側のポーリング頻度を見直す |
| 単一行INSERT・細粒度スキーマ | 小さいメタデータ操作の積み重ね | バルクロードに変更。マルチテナントはスキーマ共有 + customer_id クラスタリングへ |
| 複雑なSQLクエリ | JOINが多い、IN 句に大きなリスト |
コンパイル時間が長いクエリを見直す |
クラウドサービス費用の追跡方法
1. 日次課金サマリー(METERING_DAILY_HISTORY)
SNOWFLAKE.ACCOUNT_USAGE.METERING_DAILY_HISTORY ビューで、日ごとのCS使用量と調整後の実課金量を確認できる。
-- 過去1ヶ月のCS課金サマリー(課金量が多い日順)
SELECT
usage_date,
credits_used_cloud_services,
credits_adjustment_cloud_services,
credits_used_cloud_services + credits_adjustment_cloud_services AS billed_cloud_services
FROM snowflake.account_usage.metering_daily_history
WHERE usage_date >= DATEADD(month, -1, CURRENT_TIMESTAMP())
AND credits_used_cloud_services > 0
ORDER BY 4 DESC;
実行結果のイメージ:
| USAGE_DATE | CREDITS_USED_CLOUD_SERVICES | CREDITS_ADJUSTMENT_CLOUD_SERVICES | BILLED_CLOUD_SERVICES |
|---|---|---|---|
| 2026-03-01 | 15.234 | -10.000 | 5.234 |
| 2026-02-28 | 8.120 | -8.120 | 0.000 |
| 2026-02-27 | 12.500 | -10.000 | 2.500 |
billed_cloud_services が 0 の行は、その日のCS消費がVWの10%以内に収まっており課金されていないことを意味する。
主要列の意味:
| 列名 | 説明 |
|---|---|
CREDITS_USED_CLOUD_SERVICES |
その日の実際のCS消費量 |
CREDITS_ADJUSTMENT_CLOUD_SERVICES |
調整額(負の値。最大で10%分) |
CREDITS_BILLED |
実際に請求されるクレジット合計 |
2. ウェアハウス別の分析(WAREHOUSE_METERING_HISTORY)
CSの割合が高いウェアハウスを特定することで、問題のある処理を絞り込める。
-- CS割合が高いウェアハウスを特定
SELECT
warehouse_name,
SUM(credits_used) AS credits_used,
SUM(credits_used_cloud_services) AS credits_used_cloud_services,
ROUND(
SUM(credits_used_cloud_services) / NULLIF(SUM(credits_used), 0) * 100,
2
) AS pct_cloud_services
FROM snowflake.account_usage.warehouse_metering_history
WHERE TO_DATE(start_time) >= DATEADD(month, -1, CURRENT_TIMESTAMP())
AND credits_used_cloud_services > 0
GROUP BY 1
ORDER BY 4 DESC;
実行結果のイメージ:
| WAREHOUSE_NAME | CREDITS_USED | CREDITS_USED_CLOUD_SERVICES | PCT_CLOUD_SERVICES |
|---|---|---|---|
| ANALYTICS_WH | 45.200 | 9.800 | 21.68 |
| ETL_WH | 120.500 | 18.200 | 15.10 |
| ADHOC_WH | 30.100 | 2.500 | 8.31 |
PCT_CLOUD_SERVICES が 10% を大きく超えているウェアハウスは、前節のパターンに該当する処理が動いている可能性が高い。
3. クエリタイプ別の分析(QUERY_HISTORY)
どの種類の操作がCSを多く消費しているか確認する。
-- 過去7日間のクエリタイプ別CS消費量
SELECT
query_type,
ROUND(SUM(credits_used_cloud_services), 6) AS cs_credits,
COUNT(1) AS num_queries
FROM snowflake.account_usage.query_history
WHERE start_time >= TIMESTAMPADD(day, -7, CURRENT_TIMESTAMP)
GROUP BY 1
ORDER BY 2 DESC
LIMIT 10;
実行結果のイメージ:
| QUERY_TYPE | CS_CREDITS | NUM_QUERIES |
|---|---|---|
| SELECT | 0.024500 | 15823 |
| COPY | 0.018200 | 342 |
| INSERT | 0.009100 | 5621 |
| SHOW | 0.005800 | 12045 |
| CREATE_TABLE | 0.001200 | 87 |
SHOW クエリの件数が多く CS 消費が高い場合、サードパーティツールが頻繁にメタデータを取得していると考えられる。
4. Snowsight での確認
Snowsight の Admin > Cost Management からグラフィカルに確認できる。サービスタイプや期間でフィルタリングでき、クエリを書かずに傾向を把握するのに適している。
補足
INFORMATION_SCHEMA と ACCOUNT_USAGE の違い
追跡クエリを書く際、スキーマ選択で挙動が変わる点に注意が必要となる。
| 比較項目 | INFORMATION_SCHEMA | ACCOUNT_USAGE |
|---|---|---|
| データ取得方法 | クラウドサービスのみ | 仮想ウェアハウスを使用 |
| CS消費への影響 | 高頻度実行時に増加 | ウェアハウスに計上 |
| データ反映速度 | リアルタイム | 最大180分のレイテンシ |
| 保持期間 | 7日〜6ヶ月 | 最大365日 |
モニタリング用途では ACCOUNT_USAGE を使うのがコスト面で有利なケースが多い。
METERING_DAILY_HISTORY の注意点
- ビューのレイテンシは最大180分(3時間)
CREDITS_USED_CLOUD_SERVICES列のレイテンシは最大6時間(WAREHOUSE_METERING_HISTORY側)- 月次請求と照合する際は、セッションのタイムゾーンを UTC に設定してから参照する
ALTER SESSION SET TIMEZONE = UTC;
コスト削減の優先順位
実際の対策として効果が出やすい順に並べると以下のようになる。
- INFORMATION_SCHEMA → ACCOUNT_USAGE への切り替え — コード変更だけで対応可能
- 高頻度 SHOW コマンドの削減 — ツール設定の見直しで対応
- 単一行 INSERT のバルク化 — アーキテクチャ変更が必要だが効果大
- COPY コマンドの S3 バケット構造見直し — 段階的に対応可能
まとめ
- クラウドサービスレイヤーは認証・メタデータ管理・クエリコンパイルを担い、常時クレジットを消費する
- 課金は「1日のCS消費がVWの10%を超えた場合の超過分のみ」という仕組みで、多くの場合は調整が効く
METERING_DAILY_HISTORY・WAREHOUSE_METERING_HISTORY・QUERY_HISTORYの3つのビューで段階的に原因を特定できる- CS費用が高い場合はまず「高頻度のSHOW/INFORMATION_SCHEMAクエリ」と「単一行INSERT」を疑う