组织可以将使用 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;
不同部门的用户共享的资源
假设不同部门中的用户共享相同的仓库,并且您想要细分每个部门使用的 Credit。您可以使用 cost_center 标签标记用户来识别他们所属的部门,并且可以将 TAG_REFERENCES 视图 与 QUERY_ATTRIBUTION_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;
+-----------+--------------------+
| 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 语句计算了过去一个月(不包括空闲时间)每位用户的成本。
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 提供支持的一个或多个应用程序的成本。
这些示例假定这些应用程序设置了查询标签,用于识别执行的所有查询的应用程序。要为会话中的查询设置查询标签,请执行 ALTER SESSION 命令。例如:
ALTER SESSION SET QUERY_TAG = 'COST_CENTER=finance';
这会将 COST_CENTER=finance 标签与会话期间执行的所有后续查询相关联。
然后,您可以使用查询标签将这些查询产生的成本追溯到相应部门。
后续章节提供了使用此方法的示例。
按部门计算查询成本
以下示例计算了财务部门的计算 Credit 以及用于 Query Acceleration Service 的 Credit。这取决于 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 视图 根据查询来归因成本。每查询成本是执行查询的仓库 Credit 使用量。此成本不包括因查询执行而产生的任何其他 Credit 使用量。例如,下列内容不包括在查询成本中:
数据传输成本
存储成本
云服务成本
无服务器功能的成本
AI 服务处理的词元的成本
对于并发执行的查询,仓库的成本归因于基于给定时间间隔内资源使用量的加权平均值的单个查询。
每查询成本不包括仓库 空闲时间。空闲时间是在仓库中没有运行查询的时间段,可以在仓库级别进行测量。