コスト帰属

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

このトピックの内容:

概要

Snowflakeは、組織がSnowflakeオブジェクト階層の任意のレベルでコストを帰属できるようにする、コスト帰属機能の柔軟なセットを提供します。これらの機能は、クレジットの消費をコストセンター、環境、プロジェクトなどのグループに帰属させることができます。Snowflakeは、次の帰属戦略を提供します。

  • オブジェクトのタグ付け は、ウェアハウスやデータベースなどの個別リソースを使用するコストを組織内の特定のユニットに割り当てることを可能にする、粒度の細かい属性を提供できます。

  • クエリ を実行すると、ロール、ユーザー、またはクエリごとにウェアハウスの使用状況を特定できます。これは、複数のコストセンターが同じウェアハウスを共有している場合に特に役立ちます。

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

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

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

帰属ワークフロー

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

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

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

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

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

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

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

Three warehouses in an account

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

注釈

次の例では、ロール 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, the Snowflake web interface で、または SNOWFLAKE.ACCOUNT_USAGE スキーマをクエリすることによって利用できます。

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

  2. Admin » Usage に移動します。

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

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

  5. 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

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

共有ウェアハウスのコスト帰属

シナリオによっては、ウェアハウスが複数のチーム間で共有され、チーム間でウェアハウスコストを分割する必要が生じる場合があります。コストを分割するには、ユーザー別、 ロール 別、またはカスタムの クエリタグ 別の3つの方法があります。これらのそれぞれについて簡単に説明した後、各アプローチのレポートを生成するために使用されるクエリを示します。

ユーザー別

仮想ウェアハウスで実行されるすべてのクエリは、クエリを実行したユーザーに関連付けられています。このデータは、 QUERY_HISTORY ビュー の USER_NAME 列にあります。このデータを WAREHOUSE_METERING_HISTORY ビューの使用状況データと結合すると、ウェアハウスのコストをユーザー別に分類できます。

たとえば、 以下のクエリ を変更して USER_NAME を含めると、レポートは次のようになります。

USER_NAME

WAREHOUSE_NAME

APPROXIMATE_CREDITS_USED

JOHN

WAREHOUSE1

11.255295833

SALLY

WAREHOUSE1

3.79444444

JOHN

WAREHOUSE2

1.636703054

ロール別

仮想ウェアハウスで実行されるすべてのクエリは、クエリを実行するロールに関連付けられています。このデータは、 QUERY_HISTORY ビュー の ROLE_NAME 列にあります。すべてのSnowflakeユーザーには、少なくとも1つのロールがあります。

QUERY_HISTORY ビューのクエリのロールを WAREHOUSE_METERING_HISTORY ビューの使用状況データと結合すると、コスト管理者はウェアハウスのコストをロール別に分類できます。

たとえば、 以下のクエリ を変更して ROLE_NAME を含めると、レポートは次のようになります。

ROLE_NAME

WAREHOUSE_NAME

APPROXIMATE_CREDITS_USED

SALES_ADMIN

WAREHOUSE1

17.20239833

DEV_ADMIN

WAREHOUSE1

5.7990244

SALES_ADMIN

WAREHOUSE2

1.49765448

クエリタグ別

複数のアプリケーションが同じユーザー名とウェアハウスを共有している場合、 QUERY_TAG セッションパラメーターは、アプリケーション間のコスト帰属に役立ちます。このセッションパラメーターは、セッション内で実行されるクエリやその他の SQL ステートメントにタグを適用します。

この帰属戦略を使用するには、まずセッションの QUERY_TAG を設定します。例:

ALTER SESSION SET QUERY_TAG = 'APP1'
Copy

このパラメーターセッションに設定されると、セッション中に実行されるすべてのクエリが APP1 クエリタグとともに QUERY_HISTORY ビュー に保存されます。

特定のクエリタグに関連付けられたコストに関するレポートを実行するには、 以下のクエリ を変更して QUERY_TAG を含めます。結果は次のようになります。

QUERY_TAG

WAREHOUSE_NAME

APPROXIMATE_CREDITS_USED

SALES_APP

WAREHOUSE1

14.3027235

DEV_APP

WAREHOUSE1

11.2938568

SALES_APP

WAREHOUSE2

9.235620

クエリ: ユーザー、ロール、またはクエリタグごとにウェアハウスの使用状況を分割する

クエリを使用して、共有ウェアハウスのコストをユーザー別、ロール別、またはクエリタグ別に分割するレポートを生成できます。このクエリは、コストの分離方法に関係なく、基本的に同じです。 QUERY_HISTORY ビュー のクエリメタデータを WAREHOUSE_METERING_HISTORY ビュー の使用状況データと結合して、前月のウェアハウスコストを分類します。

レポートを生成するには、 SELECT ステートメントを変更して次のクエリを調整し、 QUERY_HISTORY ビューの適切な列を算出します。たとえば、ウェアハウスのコストをさまざまなロールに割り当てる場合は、 ROLE_NAME 列を指定します。

-- Replace <query_metadata> with USER_NAME, ROLE_NAME, or QUERY_TAG

WITH hour_execution_time_cte AS (
    SELECT <query_metadata>,
      warehouse_name,
      DATE_TRUNC('hour',START_TIME) AS start_time_hour,
      SUM(execution_time) AS hour_execution_time
    FROM snowflake.account_usage.query_history
    WHERE warehouse_name IS NOT NULL
    AND execution_time > 0

--Change the below filter if you want to look at a longer range than the last 1 month
    AND START_TIME > DATEADD(Month,-1,CURRENT_TIMESTAMP())
    GROUP BY 1,2,3
    ),
    hour_execution_total_cte AS (
      SELECT start_time_hour,
        warehouse_name,
        SUM(hour_execution_time) AS hour_execution_total
      FROM hour_execution_time_cte
      GROUP BY 1,2
    ),
    hour_approximate_credits_used AS (
        SELECT
          A.<query_metadata>,
          C.WAREHOUSE_NAME,
          (A.hour_execution_time/B.hour_execution_total)*C.credits_used AS hour_approximate_credits_used
        FROM hour_execution_time_cte A
        JOIN hour_execution_total_cte B ON A.start_time_hour = B.start_time_hour and B.warehouse_name = A.warehouse_name
        JOIN snowflake.account_usage.warehouse_metering_history C ON C.warehouse_name = A.warehouse_name AND C.start_time = A.start_time_hour
    )

SELECT
  <query_metadata>,
  warehouse_name,
  SUM(hour_approximate_credits_used) AS approximate_credits_used
FROM hour_approximate_credits_used
GROUP BY 1, 2
ORDER BY 3 DESC;
Copy