コスト帰属

組織は、Snowflakeの使用コストを組織内の論理的な単位(たとえば、異なる部門、環境、プロジェクトなど)に割り当てることができます。このチャージバックまたはショーバックモデルは、アカウント目的に有用であり、コスト削減を可能にするコントロールや最適化によって恩恵を受けることができる組織の領域をピンポイントで特定します。

コストを部門やプロジェクトなどの異なるグループに帰属させるには、以下の推奨アプローチを使用します。

  • オブジェクトタグ を使用して、リソースやユーザーを部門やプロジェクトに関連付けます。

  • クエリタグ を使用して、複数の部門に属するユーザーに代わって同じアプリケーションでクエリを実行する場合に、個々のクエリを部門またはプロジェクトに関連付けます。

コスト帰属シナリオのタイプ

以下のようなコスト帰属のシナリオは、最もよく遭遇するものです。これらのシナリオでは、コストが発生するリソースの例としてウェアハウスが使われています。

  • 単一のコストセンターまたは部門のみが使用するリソース: この例では、オブジェクトタグを使用してウェアハウスを部門に関連付けしています。これらのオブジェクトタグを使って、ウェアハウスで発生したコストを完全にその部門に属性付けることができます。

  • 複数の部門のユーザーが共有するリソース: この例は、異なる部門のユーザーが共有するウェアハウスです。この場合、オブジェクトタグを使用して、各ユーザーを部門に関連付けます。クエリのコスト帰属がユーザーに設定されます。ユーザーに割り当てられたオブジェクトタグを使用して、部門別にコストを分類できます。

  • 異なる部門のユーザーが共有するアプリケーションやワークフロー: この例は、ユーザーに代わってクエリを発行するアプリケーションです。この場合、アプリケーションによって実行される各クエリには、そのクエリを実行するユーザーのチームまたはコストセンターを識別するクエリタグが割り当てられます。

次のセクションでは、アカウントにオブジェクトタグをセットする方法を説明し、それぞれのコスト帰属状況に関する詳細を説明しています。

コスト帰属へのオブジェクトタグのセットアップ

コスト帰属に使用するグループ分けを表すタグをセットする際には、そのグループ分けが単一のアカウントに適用されるのか、複数のアカウントに適用されるのかを決定する必要があります。これにより、タグのセットアップ方法が決まります。

例えば、部門に基づいてコストを属性化したいとします。

  • 部門が使用するリソースが1つのアカウントにある場合、そのアカウントのデータベースにタグを作成します。

  • 部門が使用するリソースが複数のアカウントにまたがる場合、組織内のキーアカウントで タグを作成 し(組織のアカウント など)、 複製 でそれらのタグを他のアカウントで使用できるようにします。

次のセクションでは、タグの作成方法、タグの複製方法、リソースへのタグの適用方法を説明します。

注釈

これらのセクションの例では、タグを作成および管理する権限が付与されていると仮定されるカスタムロール tag_admin を使用しています。組織内で、より細かく設定された オブジェクトへのタグ付け権限 を使用し、安全なタグ付け戦略を策定できます。

タグの作成

戦略設計の一環として、タグを作成する予定のデータベースとスキーマを決定します。

  • タグ専用のデータベースとスキーマを作成することができます。

  • 組織内の異なるアカウントにあるリソースにタグを付けたい場合は、組織内のキーアカウント(組織アカウント など)にタグを作成します。

次の例では、 cost_management という名前のデータベースと tags という名前のスキーマを使用する予定のタグ用に作成します。

USE ROLE tag_admin;

CREATE DATABASE cost_management;
CREATE SCHEMA tags;
Copy

現在のデータベースとスキーマとして cost_managementtags を選択した状態で、 cost_center というタグを作成し、そのタグに許容される値をコストセンターの名前にセットします。

CREATE TAG cost_center
  ALLOWED_VALUES 'finance', 'marketing', 'engineering', 'product';
Copy

タグデータベースの複製

複数のアカウントを持つ組織があり、これらの他のアカウントでタグを使用できるようにしたい場合、 複製用にアカウントをセットアップ し、メインアカウントで 複製グループを作成 します(組織アカウント など)。タグを含むデータベースを複製するために、この複製グループをセットアップします。

オブジェクトタグを含むデータベースの複製

たとえば、 my_org.my_accountmy_org.my_account_2 というアカウントにタグを複製するには、組織アカウントで次のステートメントを実行します。

CREATE REPLICATION GROUP cost_management_repl_group
  OBJECT_TYPES = DATABASES
  ALLOWED_DATABASES = cost_management
  ALLOWED_ACCOUNTS = my_org.my_account_1, my_org.my_account_2
  REPLICATION_SCHEDULE = '10 MINUTE';
Copy

次に、タグを使用可能にしたい各アカウントで、セカンダリの複製グループを作成し、プライマリグループからこのグループを更新します。

CREATE REPLICATION GROUP cost_management_repl_group
  AS REPLICA OF my_org.my_org_account.cost_management_repl_group;

ALTER REPLICATION GROUP cost_management_repl_group REFRESH;
Copy

リソースとユーザーのタグ付け

タグを作成し複製したら、これらのタグを使用して、各部門に属するウェアハウスとユーザーを識別できます。例えば、販売部門は warehouse1warehouse2 の両方を使用しているため、 cost_center タグを両方のウェアハウスの 'SALES' に設定します。

Tip

理想的には、リソースやユーザーを作成するときに、これらのタグを適用するプロセスを自動化するワークフローが必要です。

USE ROLE tag_admin;

ALTER WAREHOUSE warehouse1 SET TAG cost_management.tags.cost_center='SALES';
ALTER WAREHOUSE warehouse2 SET TAG cost_management.tags.cost_center='SALES';
ALTER WAREHOUSE warehouse3 SET TAG cost_management.tags.cost_center='FINANCE';

ALTER USER finance_user SET TAG cost_management.tags.cost_center='FINANCE';
ALTER USER sales_user SET TAG cost_management.tags.cost_center='SALES';
Copy

SQL でのタグ別のコスト表示

コスト帰属は、アカウント内または組織内のアカウント間で設定できます。

  • アカウント内でのコスト帰属の設定

    ACCOUNT_USAGE スキーマの以下のビューをクエリすることで、アカウント内のコスト帰属を設定できます。

  • 組織内の複数のアカウントへのコスト帰属の設定

    組織内では、 組織アカウント から ORGANIZATION_USAGE スキーマのビューでクエリを実行することで、 単一の部署 によって排他的に使用されるリソースのコスト帰属を設定することもできます。

    注釈

    • ORGANIZATION_USAGE スキーマでは、TAG_REFERENCES ビューは組織アカウントでのみ使用できます。

    • QUERY_ATTRIBUTION_HISTORY ビューは、アカウントの ACCOUNT_USAGE スキーマでのみ使用できます。組織全体に相当するビューはありません。

次のセクションでは、 一般的なコスト帰属の状況 をいくつか挙げて、コスト帰属を設定する方法を説明します。

部門間で共有されていないリソース

部門別にコスト帰属を設定し、各部門が専用ウェアハウスのセットを使用しているとします。

ウェアハウスを所有する部門を特定する cost_center タグでウェアハウスにタグ付けする場合、 object_idwarehouse_id 列で ACCOUNT_USAGE TAG_REFERENCES ビューWAREHOUSE_METERING_HISTORY ビュー を結合して、ウェアハウス別の使用情報を取得します。また、 tag_value 列を使用すると、それらのウェアハウスを所有する部門を特定できます。

専用ウェアハウスにコスト帰属を設定するためTAG_REFERENCESとWAREHOUSE_METERING_HISTORYを結合する

次のSQLステートメントは、この結合を実行します。

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
          AND TAG_REFERENCES.domain = 'WAREHOUSE'
  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 |
+-------------+-------------+-----------------+

組織アカウント のORGANIZATION_USAGEスキーマのビューを使用して、組織内のすべてのアカウントに対して同じ 属性を実行する場合は同様のクエリを実行できます。残りのクエリは変わりません。

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.ORGANIZATION_USAGE.WAREHOUSE_METERING_HISTORY
      LEFT JOIN SNOWFLAKE.ORGANIZATION_USAGE.TAG_REFERENCES
        ON WAREHOUSE_METERING_HISTORY.warehouse_id = TAG_REFERENCES.object_id
          AND TAG_REFERENCES.domain = 'WAREHOUSE'
          AND tag_database = 'COST_MANAGEMENT' AND tag_schema = 'TAGS'
  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

異なる部門のユーザーが共有するリソース

異なる部門のユーザーが同じウェアハウスを共有しており、各部門が使用するクレジットを分類したいとします。ユーザーの所属部署を識別するために、 cost_center タグを付けて、 TAG_REFERENCES ビューQUERY_ATTRIBUTION_HISTORY ビュー を結合します。

注釈

一度に取得できるデータは1アカウント分のみです。組織内のアカウント間でこのデータを取得するクエリを実行することはできません。

共有ウェアハウスにコスト帰属を設定するためTAG_REFERENCESとWAREHOUSE_METERING_HISTORYを結合する

次のセクションでは、共有リソースのコスト帰属を設定するSQLステートメントの例を示します。

先月のユーザークエリのコストの計算

次のSQLステートメントでは、先月のコストを計算しています。

この例では、使用量に比例してユーザー間で アイドル時間が分配 されます。

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 |
|-----------+--------------------+
| FINUSER   | 6.603575468        |
| SALESUSER | 4.321378049        |
| ENGUSER   | 0.6217131392       |
|-----------+--------------------+

部門別のユーザークエリのコストの計算(アイドルタイムなし)

次の例では、各部門のユーザーが実行したクエリを通して、各部門に計算コストの属性を設定しています。このクエリは、ユーザーオブジェクトが部署を識別するタグを持っているかどうかに依存します。

WITH joined_data AS (
  SELECT
      tr.tag_name,
      tr.tag_value,
      qah.credits_attributed_compute,
      qah.start_time
    FROM SNOWFLAKE.ACCOUNT_USAGE.TAG_REFERENCES tr
      JOIN SNOWFLAKE.ACCOUNT_USAGE.QUERY_ATTRIBUTION_HISTORY qah
        ON tr.domain = 'USER' AND tr.object_name = qah.user_name
)
SELECT
    tag_name,
    tag_value,
    SUM(credits_attributed_compute) AS total_credits
  FROM joined_data
  WHERE start_time >= DATEADD(MONTH, -1, CURRENT_DATE)
    AND start_time < CURRENT_DATE
  GROUP BY tag_name, tag_value
  ORDER BY tag_name, tag_value;
Copy
+-------------+-------------+-----------------+
| TAG_NAME    | TAG_VALUE   |   TOTAL_CREDITS |
|-------------+-------------+-----------------|
| COST_CENTER | engineering |   0.02493688426 |
| COST_CENTER | finance     |    0.2281084988 |
| COST_CENTER | marketing   |    0.3686840545 |
|-------------+-------------+-----------------|

ユーザー別のクエリのコストの計算(アイドルタイムなし)

次のSQLステートメントは、過去1ヶ月のユーザーあたりのコストを計算しています(アイドルタイムを除く)。

SELECT user_name, SUM(credits_attributed_compute) AS credits
  FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_ATTRIBUTION_HISTORY
  WHERE
    start_time >= DATEADD(MONTH, -1, CURRENT_DATE)
    AND start_time < CURRENT_DATE
  GROUP BY user_name;
Copy
+-----------+--------------------+
| USER_NAME | ATTRIBUTED_CREDITS |
|-----------+--------------------|
| JSMITH    |       17.173333333 |
| MJONES    |         8.14444444 |
| SYSTEM    |         5.33985393 |
+-----------+--------------------+

タグを持たないユーザー別のクエリのコストの計算

次の例では、タグが付けられていないユーザーによるクエリのコストを計算しています。タグが一貫してユーザーに適用されているかどうかを確認するために使用できます。

SELECT qah.user_name, SUM(qah.credits_attributed_compute) as total_credits
  FROM
    SNOWFLAKE.ACCOUNT_USAGE.QUERY_ATTRIBUTION_HISTORY qah
    LEFT JOIN snowflake.account_usage.tag_references tr
    ON qah.user_name = tr.object_name AND tr.DOMAIN = 'USER'
  WHERE
    start_time >= dateadd(month, -1, current_date)
    AND qah.user_name IS NULL OR tr.object_name IS NULL
  GROUP BY qah.user_name
  ORDER BY total_credits DESC;
Copy
+------------+---------------+
| USER_NAME  | TOTAL_CREDITS |
|------------+---------------|
| RSMITH     |  0.1830555556 |
+------------+---------------+

異なる部門にコスト帰属を設定する必要があるアプリケーションで使用されるリソース

このセクションの例では、Snowflakeを使用する1つまたは複数のアプリケーションのコストを計算しています。

この例では、これらのアプリケーションが、実行されるすべてのクエリに対してアプリケーションを識別するクエリタグをセットすることを想定しています。セッション内のクエリにクエリタグをセットするには、 ALTER SESSION コマンドを実行します。例:

ALTER SESSION SET QUERY_TAG = 'COST_CENTER=finance';
Copy

これにより、 COST_CENTER=finance タグがセッション中に実行される後続のすべてのクエリに関連付けられます。

そして、クエリタグを使用して、これらのクエリで発生したコストを適切な部門にトレースバックすることができます。

次のセクションでは、このアプローチの使用例を示します。

部門別のクエリのコストの計算

以下の例では、財務部の クエリアクセラレーションサービス に使用されたクレジットと計算クレジットを計算しています。これは、実行された元のクエリに COST_CENTER=finance クエリタグが適用されているかどうかによって異なります。

コストにはアイドルタイムが 含まれていない 点に注意してください。

SELECT
    query_tag,
    SUM(credits_attributed_compute) AS compute_credits,
    SUM(credits_used_query_acceleration) AS qas
  FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_ATTRIBUTION_HISTORY
  WHERE query_tag = 'COST_CENTER=finance'
  GROUP BY query_tag;
Copy
+---------------------+-----------------+------+
| QUERY_TAG           | COMPUTE_CREDITS | QAS  |
|---------------------+-----------------|------|
| COST_CENTER=finance |      0.00576115 | null |
+---------------------+-----------------+------+

クエリタグ別のクエリのコストの計算(アイドル時間を除く)

次の例では、クエリタグ別にクエリのコストを計算し、タグのないクエリを含めています(「タグなし」で識別)。

SELECT
    COALESCE(NULLIF(query_tag, ''), 'untagged') AS tag,
    SUM(credits_attributed_compute) AS compute_credits,
    SUM(credits_used_query_acceleration) AS qas
  FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_ATTRIBUTION_HISTORY
  WHERE start_time >= DATEADD(MONTH, -1, CURRENT_DATE)
  GROUP BY tag
  ORDER BY compute_credits DESC;
Copy
+-------------------------+-----------------+------+
| TAG                     | COMPUTE_CREDITS | QAS  |
|-------------------------+-----------------+------+
| untagged                | 3.623173449     | null |
| COST_CENTER=engineering | 0.531431948     | null |
|-------------------------+-----------------+------+

クエリタグ別のクエリのコストの計算(アイドル時間を含む)

次の例では、クエリごとのコストに含まれないアイドル時間を、各部門のウェアハウスの使用量に比例して配分しています。

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 >= DATEADD(MONTH, -1, 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
  ORDER BY attributed_credits DESC;
Copy
+-------------------------+--------------------+
| TAG                     | ATTRIBUTED_CREDITS |
+-------------------------+--------------------|
| untagged                |        9.020031304 |
| COST_CENTER=finance     |        1.027742521 |
| COST_CENTER=engineering |        1.018755812 |
| COST_CENTER=marketing   |       0.4801370376 |
+-------------------------+--------------------+

Snowsight でのタグ別のコスト表示

cost_center タグのあるリソースの使用を報告すると、コストを帰属させることができます。このデータには Snowsight でアクセスできます。

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

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

  3. Consumption を選択します。

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

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

  6. Apply を選択します。

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

QUERY_ATTRIBUTION_HISTORY ビューについて

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

  • データ転送コスト

  • ストレージコスト

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

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

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

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

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

その他のクエリ例

次のセクションでは、コスト帰属に使用できる追加のクエリを示します。

類似クエリのグループ化

反復または類似のクエリの場合は、 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