Snowflakeでクレジットの使用状況を確認してみた 〜SQL編〜

2021.08.06

こんにちは!エノカワです。

Snowflakeではリソースの消費に対する支払いにクレジットという測定単位が使用されます。
支払いに直結するため、クレジットの使用状況を確認することが費用を試算する上でポイントになってきます。

前回の記事ではウェブインターフェイスでクレジットの使用状況を確認しました。

Snowflakeの利用形態やクレジットの説明は前回の記事にありますので参照ください。

SnowflakeではウェブインターフェイスSQLの両方でクレジットの使用状況を確認できます。
今回はもう一つの方法であるSQLでクレジットの使用状況を確認してみました。

SNOWFLAKEデータベース

SnowflakeはSNOWFLAKEという名前の共有データベースを介して、アカウントの履歴データを提供します。
データベースには以下の2つの読み取り専用スキーマが含まれており、各スキーマにはビューのセットが含まれています。

  • ACCOUNT_USAGE
    アカウントのオブジェクトメタデータと使用メトリックを表示するビュー
  • READER_ACCOUNT_USAGE
    アカウント用に作成されたすべてのリーダーアカウントのオブジェクトメタデータと使用メトリックを表示するビュー

スキーマ内のビューは、Snowflakeの他のビューと同様にクエリできます。
今回はACCOUNT_USAGEのビューにクエリを実行し、クレジットの使用状況を確認していきたいと思います。

クレジット使用状況を含むビュー

今回使用するのは以下の4つのビューです。
クレジット使用状況に関する項目が含まれており、過去365日(1年)の履歴を参照することができます。

  • WAREHOUSE_METERING_HISTORY
    • ウェアハウスの時間単位のクレジット使用状況
  • METERING_HISTORY
    • アカウントの時間単位のクレジット使用状況
  • METERING_DAILY_HISTORY
    • アカウントの毎日のクレジット使用状況とクラウドサービスリベート
  • QUERY_HISTORY
    • Snowflakeクエリ履歴

ビューによって履歴データの単位が異なります。
また、クラウドサービスで使用されたクレジット数はすべてのビューに含まれますが、
コンピューティングリソース(ウェアハウス)に使用されたクレジット数はQUERY_HISTORYには含まれていません。

ビュー名 単位 コンピューティングリソース クラウドサービス
WAREHOUSE_METERING_HISTORY ウェアハウス別/1時間単位
METERING_HISTORY サービスタイプ別/1時間単位
METERING_DAILY_HISTORY サービスタイプ別/日単位
QUERY_HISTORY クエリ単位

METERING_HISTORY,METERING_DAILY_HISTORYサービスタイプには以下の6つがあります。

  • WAREHOUSE_METERING
  • WAREHOUSE_METERING_READER
  • AUTOMATIC_CLUSTERING
  • MATERIALIZED_VIEW
  • PIPE
  • REPLICATION

クレジット使用状況の確認

それではSQLでクレジットの使用状況を確認してみましょう。

ロールの切り替え

クレジット使用状況の情報にアクセスするためにアカウント管理者のロールに変更する必要があります。
以下のクエリを実行し、ロールをACCOUNTADMINに変更します。
ここでスキーマもSNOWFLAKEデータベースのACCOUNT_USAGEに変更しておきましょう。

use role ACCOUNTADMIN;
use schema SNOWFLAKE.ACCOUNT_USAGE;

ロールをACCOUNTADMINに変更すると、画面左部のデータベースオブジェクト一覧にSNOWFLAKEが表示されるようになります。  

一覧からビューを選択すると、メニューから「データをプレビュー」することができます。

WAREHOUSE_METERING_HISTORY

データをプレビュー

ウェアハウスごとに1時間単位のクレジット使用状況をクエリできます。

クレジット使用状況に関する3つの項目の説明は以下の通りです。
ウェアハウス、クラウドサービスそれぞれに使用されたクレジットの内訳とその合計を知ることができます。

  • CREDITS_USED
    • 時間内にウェアハウスに使用されたクレジットの総数
    • CREDITS_USED_COMPUTECREDITS_USED_CLOUD_SERVICESの合計
    • クラウドサービスの調整を考慮していないため、実際のクレジット消費量よりも大きくなる場合がある
  • CREDITS_USED_COMPUTE
    • 時間内にウェアハウスに使用されたクレジットの数
  • CREDITS_USED_CLOUD_SERVICES
    • 時間内にクラウドサービスに使用されたクレジットの数


SQLでクレジット使用状況を確認してみましょう。

ウェアハウス別クレジット使用状況

ウェアハウスごとに当月消費したクレジットの合計、平均、時間数をクエリします。

select
  warehouse_name,
  sum(credits_used) as total_credits_used,
  avg(credits_used) as average_credits_used,
  count(credits_used) as hours_credits_used
from
  WAREHOUSE_METERING_HISTORY
where
  start_time >= date_trunc(month, current_date)
group by
  warehouse_name
order by
  warehouse_name
;

多くのコンピューティングリソースクレジットを消費したウェアハウスを検索

コンピューティングリソースクレジットの消費が多い順にウェアハウスをソートします。

select
  warehouse_name,
  sum(credits_used_compute) as credits_used_compute,
  sum(credits_used_cloud_services) as credits_used_cloud_services,
  sum(credits_used) as credits_used
from
  WAREHOUSE_METERING_HISTORY
where
  start_time >= date_trunc(month, current_date)
group by
  warehouse_name
order by
  credits_used_compute desc
;

METERING_HISTORY

データをプレビュー

サービスタイプごとに1時間単位のクレジット使用状況をクエリできます。


SQLでクレジット使用状況を確認してみましょう。

特定ウェアハウスのクレジット使用状況

COMPUTE_WHの直近1週間の履歴をクエリします。

select
  name,
  service_type,
  start_time,
  end_time,
  credits_used
from
  METERING_HISTORY
where
  name = 'COMPUTE_WH'
and
  start_time >= timestampadd(week, -1, current_timestamp)
order by
  start_time
;

多くのクラウドサービスリソースを消費している時間帯を検索

クラウドサービスクレジットの消費が多い順に時間帯をソートします。

select
  hour(start_time) as hour,
  sum(credits_used_cloud_services) as credits_used_cloud_services,
  sum(credits_used_compute) as credits_used_compute,
  sum(credits_used) as credits_used
from
  METERING_HISTORY
where
  start_time >= timestampadd(week, -1, current_timestamp)
group by
  hour
order by
  credits_used_cloud_services desc
;

METERING_DAILY_HISTORY

データをプレビュー

サービスタイプごとに日単位のクレジット使用状況をクエリできます。

本ビューでは、クラウドサービス用に調整されたクレジット数を知ることができます。
クラウドサービスは、コンピューティングリソースの1日の使用量の10%を超えた場合にのみ請求されますので、
10%を超えない分は調整(減額)されます。
以下の2つの項目で調整されたクレジット数と請求されたクレジット総数を確認することができます。

  • CREDITS_ADJUSTMENT_CLOUD_SERVICES
    • クラウドサービス用に調整されたクレジットの数
    • 負の値(例: -9)
  • CREDITS_BILLED
    • 当日アカウントに対して請求されたクレジットの総数
    • CREDITS_USED_COMPUTECREDITS_USED_CLOUD_SERVICESCREDITS_ADJUSTMENT_CLOUD_SERVICESの合計


SQLでクレジット使用状況を確認してみましょう。

サービスタイプ別クレジット使用状況

サービスタイプごとに直近1週間で消費したクレジットの合計、平均、日数をクエリします。

select
  service_type,
  sum(credits_used) as total_credits_used,
  avg(credits_used) as average_credits_used,
  count(credits_used) as days_credits_used
from
  METERING_DAILY_HISTORY
where
  usage_date >= timestampadd(week, -1, current_timestamp)
group by
  service_type
order by
  service_type
;

特定サービスタイプのクレジット使用状況

WAREHOUSE_METERINGの直近1週間の履歴をクエリします。

select
  service_type,
  usage_date,
  credits_used_compute,
  credits_used_cloud_services,
  credits_used,
  credits_adjustment_cloud_services,
  credits_billed,
  (credits_used_cloud_services > credits_used_compute * 0.1) as over_10per
from
  METERING_DAILY_HISTORY
where
  usage_date >= timestampadd(week, -1, current_timestamp)
 and
  service_type = 'WAREHOUSE_METERING'
order by
  service_type,
  usage_date
;

QUERY_HISTORY

データをプレビュー

クエリごとにクラウドサービスクレジットの使用状況をクエリできます。

※本ビューは項目が多いため、上図では「データをプレビュー」ではなく主要な項目をクエリしています。


SQLでクレジット使用状況を確認してみましょう。

クエリタイプ別クラウドサービスクレジット使用状況

クエリタイプごとに直近1ヶ月で消費したクレジットの合計、平均、日数をクエリします。

select
  query_type,
  sum(credits_used_cloud_services) as cs_credits,
  count(query_type) as num_queries
from
  QUERY_HISTORY
where
  start_time >= timestampadd(month, -1, current_timestamp)
group by
  query_type
order by
  cs_credits desc
limit 10
;

特定クエリタイプのクラウドサービスクレジット使用状況

COPYの直近1ヶ月の履歴をクエリします。

select
  credits_used_cloud_services,
  query_text,
  database_name,
  schema_name,
  warehouse_name,
  warehouse_size,
  cluster_number
from
  QUERY_HISTORY
where
  start_time >= timestampadd(month, -1, current_timestamp)
 and
  query_type = 'COPY'
order by
  credits_used_cloud_services desc
limit 10
;

Snowsightによる可視化

Snowflakeの新しいウェブインターフェイスではSnowsightを使用することでクエリ結果を可視化できます。
以下のようにクレジット使用状況を可視化するといった活用も可能です。

Snowsightに関する記事もありますので良ければ参考にしてみてください。

まとめ

以上、SQLでクレジットの使用状況を確認してみました。

ウェブインターフェイス編と同様に特別な準備作業の必要もなく、
通常のSQLと同じ感覚で簡単に確認することができました。

ウェブインターフェイスで大まかな概算を確認し、SQLで詳細の確認や集計を行う、
といった使い分けができそうだと感じました。

Snowsightで可視化することでコスト課題の洗い出しなどにも活用できそうですね。

参考