コスト帰属

組織は、組織内における論理ユニット(例: 部門、環境、プロジェクト)にコストを帰属させると、Snowflakeの使用コストに対する洞察を得られます。このチャージバックまたはショーバックモデルは会計目的に役立ちますが、組織は、どのユニットが最も多く支出しているかを特定することもできるようになります。この洞察は、コストを削減するために、管理と最適化の恩恵を受けることができる組織の領域を特定するのに役立ちます。

個別リソースのコスト帰属

コストを部門、環境、プロジェクトなどのさまざまなグループに帰属させる最も直接的で強力な方法は、 オブジェクトのタグ付け 機能を使用して特定のリソースにタグを付けることです。この戦略では、管理者はタグ(例: cost_center)を作成し、タグの可能な値のリスト(例: salesfinance)を定義します。この例では、各コストセンターが一意なタグ値を取得します。次に、タグと値の組み合わせが、コストセンターにより使用されるリソースに割り当てられます。これらのリソースはクレジットを消費するため、タグ値でグループ化されたレポートを実行できます。このタグ値は組織内の特定のグループに直接対応するため、コストを正確に特定できます。

オブジェクトのタグ付けを使用すると、アカウントのような一般的なものやテーブルのような具体的なものに基づいてコストを帰属させることができます。すべての タグ付け可能なオブジェクト がコストを累積できるわけではないことに注意してください。コスト管理の観点からは、オブジェクトのタグ付けは、そのオブジェクトに関連する使用状況またはコストデータを含むスキーマビューがある場合にのみ意味があります。Snowflakeの使用状況とコストビューのリストについては、 総コストの調査 をご参照ください。

帰属ワークフロー

オブジェクトタグを使用したコストの帰属は、次の3つの基本的なタスクで構成されます。

  1. タグ付け戦略を設計し、適切なタグを作成します。

  2. 正しいタグと値のペアでリソースにタグを付けます。

  3. 使用状況とタグデータに基づいてレポートを実行します。

このワークフローを説明するために、次のようなSnowflakeアカウントを考えてみましょう。

  • 営業と財務の2つのコストセンターがあります。

  • ウェアハウスが3つあります。営業はウェアハウス1とウェアハウス2を使用し、財務部門はウェアハウス3を使用します。

アカウント内の3つのウェアハウス

この例の目標は、各ウェアハウスに関連付けられたウェアハウスコストを適切な部門に割り当てることです。

注釈

次の例では、ロール tag_admin に適切な権限が付与されていることを前提としています。組織は、粒度の細かい タグ付け権限 を使用して、安全なタグ付け戦略を開発できます。

タスク1: タグ付け戦略を設計し、適切なタグを作成する

この例では、適切な権限を持つ管理者が cost_center という単一のタグを作成します。

USE ROLE tag_admin;
USE SCHEMA my_db.my_schema;
CREATE TAG cost_center;
Copy
タスク 2: 正しいタグ/値のペアでオブジェクトにタグを付ける

タグ管理者は、適切なタグ/値のペアをウェアハウスに適用します。たとえば、営業部門は warehouse1warehouse2 の両方を使用するため、同じタグ/値の組み合わせがこれら2つのリソースに適用されます。

USE ROLE tag_admin;
ALTER WAREHOUSE warehouse1 SET TAG cost_center='SALES';
ALTER WAREHOUSE warehouse2 SET TAG cost_center='SALES';
ALTER WAREHOUSE warehouse3 SET TAG cost_center='FINANCE';
Copy

注釈

管理者がオブジェクトに設定できる値を制御する場合は、タグの作成時にオプションの allowed_values パラメーターを使用できます。詳細については、 CREATE TAG をご参照ください。

タスク3: 使用状況とタグデータに基づいてレポートを実行する

cost_center タグのあるリソースの使用を報告すると、コストを帰属させることができます。このデータは、 Snowsight で、または SNOWFLAKE.ACCOUNT_USAGE スキーマをクエリすることによって利用できます。

Snowsight:
  1. ACCOUNT_USAGE スキーマへのアクセス権 を持つロールに切り替えます。

  2. Admin » Cost Management に移動します。

  3. Consumption を選択します。

  4. Tags ドロップダウンから、 cost_center タグを選択します。

  5. 特定のコストセンターに焦点を当てるには、タグの値のリストから値を選択します。

  6. Apply を選択します。

Snowsight でのフィルタリングに関する詳細については、 タグ別にフィルターする をご参照ください。

SQL:

Account Usage スキーマには、リソースの使用状況とスキーマ内のタグの両方に関するデータが含まれています。このスキーマのビューに対してクエリを実行すると、ウェアハウスによるクレジット消費が正しいコストセンターに帰属するようになります。

USE snowflake.account_usage;

SELECT tag_value AS cost_center,
  SUM(credits_used)
FROM warehouse_metering_history, tag_references
WHERE warehouse_name=object_name
  AND tag_name='COST_CENTER'
GROUP BY 1
ORDER BY 2 DESC;
Copy

クエリは次のようなレポートを返します。

COST_CENTER

CREDITS_USED

SALES

17.173333333

FINANCE

8.14444444

指定された月のすべてのウェアハウスのコスト帰属をタグとタグ値で表示できます。このクエリは、タグ付けされていないウェアハウスも特定します:

SELECT tag_references.tag_name,
     COALESCE(tag_references.tag_value, 'untagged') AS tag_value,
     SUM(warehouse_metering_history.credits_used_compute) AS total_credits
FROM snowflake.account_usage.warehouse_metering_history
LEFT JOIN snowflake.account_usage.tag_references
ON warehouse_metering_history.warehouse_id = tag_references.object_id
WHERE warehouse_metering_history.start_time >= DATE_TRUNC('MONTH', DATEADD(MONTH, -1, CURRENT_DATE))
  AND warehouse_metering_history.start_time < DATE_TRUNC('MONTH',  CURRENT_DATE)
GROUP BY tag_references.tag_name, COALESCE(tag_references.tag_value, 'untagged')
ORDER BY total_credits DESC;
Copy
+-------------+-------------+-----------------+
| TAG_NAME    | TAG_VALUE   |   TOTAL_CREDITS |
|-------------+-------------+-----------------|
| NULL        | untagged    |    20.360277159 |
| COST_CENTER | Sales       |    17.173333333 |
| COST_CENTER | Finance     |      8.14444444 |
+-------------+-------------+-----------------+

オブジェクトタグの使用の詳細については、 オブジェクトのタグ付け をご参照ください。

クエリのコスト帰属

QUERY_ATTRIBUTION_HISTORY ビュー を使用して、クエリに基づくコスト帰属を設定することができます。クエリあたりのコストは、クエリを実行するためのウェアハウスのクレジット使用量です。このコストには、クエリ実行の結果発生するその他のクレジット使用量は含まれません。例えば、以下のものはクエリコストに含まれません:

  • データ転送コスト

  • ストレージコスト

  • クラウドサービスコスト

  • サーバーレス機能のコスト

  • AI サービスによって処理されるトークンのコスト

同時に実行されるクエリの場合、ウェアハウスのコストは、与えられた時間間隔におけるリソース消費の加重平均に基づいて、個々のクエリに帰属します。

クエリあたりのコストには、ウェアハウスの アイドル時間 は含まれていません。アイドル時間とは、ウェアハウス内でクエリが実行されていない時間のことで、ウェアハウスレベルで測定することができます。

タグ、ユーザー、クエリ別のコスト帰属

タグ別、ユーザー別、クエリ別(たとえば反復クエリ)に、ウェアハウスコストとクエリコストを設定できます。

クエリタグに基づくウェアハウスコストの帰属

QUERY_TAG パラメータを使用して、異なるワークロードにコストを割り当てることができます。クエリタグは、ワークロードまたはクエリのセットに対してセッションレベルで割り当てることができます。タグベースのアトリビューションの詳細については、 アトリビューションワークフロー を参照してください。

セッションにクエリタグを設定するには、以下の手順に従います:

  1. タグを作成します。例えば、財務チームのタグを作成します:

    CREATE TAG finance;
    
    Copy
  2. 現在のセッションのクエリタグを設定します:

    ALTER SESSION SET query_tag = finance;
    
    Copy

    finance タグは、セッション中に実行されたすべてのクエリに関連付けられます。

  3. 当月のすべてのタグ付きクエリのウェアハウスコストを表示するには、以下のステートメントを実行します。このクエリでは、ウェアハウスの計算コスト全体が、照合のためにタグ(アイドル時間を含む)全体に割り当てられることに注意してください:

    WITH wh_bill AS (
       SELECT SUM(credits_used_compute) AS compute_credits
         FROM SNOWFLAKE.ACCOUNT_USAGE.WAREHOUSE_METERING_HISTORY
         WHERE start_time >= DATE_TRUNC('MONTH', CURRENT_DATE)
         AND start_time < CURRENT_DATE
    ),
    tag_credits AS (
       SELECT COALESCE(NULLIF(query_tag, ''), 'untagged') AS tag,
              SUM(credits_attributed_compute) AS credits
         FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_ATTRIBUTION_HISTORY
         WHERE start_time >= DATE_TRUNC('MONTH', CURRENT_DATE)
         AND start_time < CURRENT_DATE
         GROUP BY tag
    ),
    total_credit AS (
       SELECT SUM(credits) AS sum_all_credits
         FROM tag_credits
    )
    SELECT tc.tag,
           tc.credits / t.sum_all_credits * w.compute_credits AS attributed_credits
      FROM tag_credits tc, total_credit t, wh_bill w;
    
    Copy

ウェアハウスコストのユーザーベースの帰属

ウェアハウスコストをユーザー別に設定することができます。例えば、当月の各ユーザーに帰属するウェアハウスコストの合計を求めるには、以下のステートメントを実行します:

WITH wh_bill AS (
   SELECT SUM(credits_used_compute) AS compute_credits
     FROM SNOWFLAKE.ACCOUNT_USAGE.WAREHOUSE_METERING_HISTORY
     WHERE start_time >= DATE_TRUNC('MONTH', CURRENT_DATE)
     AND start_time < CURRENT_DATE
),
user_credits AS (
   SELECT user_name, SUM(credits_attributed_compute) AS credits
     FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_ATTRIBUTION_HISTORY
     WHERE start_time >= DATE_TRUNC('MONTH', CURRENT_DATE)
     AND start_time < CURRENT_DATE
     GROUP BY user_name
),
total_credit AS (
   SELECT SUM(credits) AS sum_all_credits
     FROM user_credits
)
SELECT u.user_name,
       u.credits / t.sum_all_credits * w.compute_credits AS attributed_credits
  FROM user_credits u, total_credit t, wh_bill w
  ORDER BY attributed_credits DESC;
Copy
+-----------+--------------------+
| USER_NAME | ATTRIBUTED_CREDITS |
|-----------+--------------------|
| JSMITH    |       17.173333333 |
|-----------+--------------------|
| MJONES    |         8.14444444 |
|-----------+--------------------|
| SYSTEM    |         5.33985393 |
+-----------+--------------------+

反復クエリのクエリコスト

反復または類似のクエリの場合は、 query_hash または query_parameterized_hash を使用して、クエリごとにコストをグループ化します。

当月で最も高額な反復クエリを検索するには、以下のステートメントを実行します:

SELECT query_parameterized_hash,
       COUNT(*) AS query_count,
       SUM(credits_attributed_compute) AS total_credits
  FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_ATTRIBUTION_HISTORY
  WHERE start_time >= DATE_TRUNC('MONTH', CURRENT_DATE)
  AND start_time < CURRENT_DATE
  GROUP BY query_parameterized_hash
  ORDER BY total_credits DESC
  LIMIT 20;
Copy

クエリ ID に基づく追加クエリについては、 を参照してください。

階層クエリのクエリコスト

複数の階層クエリを発行するストアドプロシージャの場合、プロシージャのルートクエリ ID を使用して、プロシージャの帰属クエリコストを計算できます。

  1. ストアドプロシージャのルートクエリ ID を見つけるには、 ACCESS_HISTORY ビュー を使用します。例えば、ストアドプロシージャのルートクエリ ID を見つけるには、 query_id を設定し、以下のステートメントを実行します:

    SET query_id = '<query_id>';
    
    SELECT query_id,
           parent_query_id,
           root_query_id,
           direct_objects_accessed
      FROM SNOWFLAKE.ACCOUNT_USAGE.ACCESS_HISTORY
      WHERE query_id = $query_id;
    
    Copy

    詳細については、 例: ストアドプロシージャによる祖先クエリ をご参照ください。

  2. プロシージャ全体のクエリコストを合計するには、 < root_query_id > を置き換え、以下のステートメントを実行します:

    SET query_id = '<root_query_id>';
    
    SELECT SUM(credits_attributed_compute) AS total_attributed_credits
      FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_ATTRIBUTION_HISTORY
      WHERE (root_query_id = $query_id OR query_id = $query_id);
    
    Copy