組織は、Snowflakeの使用コストを組織内の論理的な単位(たとえば、異なる部門、環境、プロジェクトなど)に割り当てることができます。このチャージバックまたはショーバックモデルは、アカウント目的に有用であり、コスト削減を可能にするコントロールや最適化によって恩恵を受けることができる組織の領域をピンポイントで特定します。
SQL でのタグ別のコスト表示
コスト帰属は、アカウント内または組織内のアカウント間で設定できます。
次のセクションでは、 一般的なコスト帰属の状況 をいくつか挙げて、コスト帰属を設定する方法を説明します。
部門間で共有されていないリソース
部門別にコスト帰属を設定し、各部門が専用ウェアハウスのセットを使用しているとします。
ウェアハウスを所有する部門を特定する cost_center タグでウェアハウスにタグ付けする場合、 object_id と warehouse_id 列で ACCOUNT_USAGE TAG_REFERENCES ビュー と WAREHOUSE_METERING_HISTORY ビュー を結合して、ウェアハウス別の使用情報を取得します。また、 tag_value 列を使用すると、それらのウェアハウスを所有する部門を特定できます。
次の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;
+-------------+-------------+-----------------+
| 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;
異なる部門のユーザーが共有するリソース
異なる部門のユーザーが同じウェアハウスを共有しており、各部門が使用するクレジットを分類したいとします。ユーザーの所属部署を識別するために、 cost_center タグを付けて、 TAG_REFERENCES ビュー と QUERY_ATTRIBUTION_HISTORY ビュー を結合します。
注釈
一度に取得できるデータは1アカウント分のみです。組織内のアカウント間でこのデータを取得するクエリを実行することはできません。
次のセクションでは、共有リソースのコスト帰属を設定する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;
+-----------+--------------------+
| 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;
+-------------+-------------+-----------------+
| 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;
+-----------+--------------------+
| USER_NAME | ATTRIBUTED_CREDITS |
|-----------+--------------------|
| JSMITH | 17.173333333 |
| MJONES | 8.14444444 |
| SYSTEM | 5.33985393 |
+-----------+--------------------+
異なる部門にコスト帰属を設定する必要があるアプリケーションで使用されるリソース
このセクションの例では、Snowflakeを使用する1つまたは複数のアプリケーションのコストを計算しています。
この例では、これらのアプリケーションが、実行されるすべてのクエリに対してアプリケーションを識別するクエリタグをセットすることを想定しています。セッション内のクエリにクエリタグをセットするには、 ALTER SESSION コマンドを実行します。例:
ALTER SESSION SET QUERY_TAG = 'COST_CENTER=finance';
これにより、 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;
+---------------------+-----------------+------+
| 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;
+-------------------------+-----------------+------+
| 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;
+-------------------------+--------------------+
| TAG | ATTRIBUTED_CREDITS |
+-------------------------+--------------------|
| untagged | 9.020031304 |
| COST_CENTER=finance | 1.027742521 |
| COST_CENTER=engineering | 1.018755812 |
| COST_CENTER=marketing | 0.4801370376 |
+-------------------------+--------------------+
QUERY_ATTRIBUTION_HISTORY ビューについて
QUERY_ATTRIBUTION_HISTORY ビュー を使用して、クエリに基づくコスト帰属を設定することができます。クエリあたりのコストは、クエリを実行するためのウェアハウスのクレジット使用量です。このコストには、クエリ実行の結果発生するその他のクレジット使用量は含まれません。例えば、以下のものはクエリコストに含まれません:
データ転送コスト
ストレージコスト
クラウドサービスコスト
サーバーレス機能のコスト
AI サービスによって処理されるトークンのコスト
同時に実行されるクエリの場合、ウェアハウスのコストは、与えられた時間間隔におけるリソース消費の加重平均に基づいて、個々のクエリに帰属します。
クエリあたりのコストには、ウェアハウスの アイドル時間 は含まれていません。アイドル時間とは、ウェアハウス内でクエリが実行されていない時間のことで、ウェアハウスレベルで測定することができます。