成本归因¶
组织可以将使用 Snowflake 的成本分摊到组织内的逻辑单元(例如,分摊到不同的部门、环境或项目)。这种计费分摊或成本展示模式有助于进行会计核算,并能明确指出组织中可通过管控和优化来降低成本的领域。
要将成本归因于不同的组(如部门或项目),请使用以下推荐的方法:
成本归因场景类型¶
以下是最常见的成本归因场景。在这些场景中,仓库作为产生成本的资源的示例。
单个成本中心或部门专用的资源: 例如,使用对象标签将仓库与部门相关联。您可以使用这些对象标签将这些仓库产生的成本完全归因于该部门。
由多个部门的用户共享的资源: 例如,由不同部门的用户共享的仓库。在这种情况下,您可以使用对象标签将每个用户与部门相关联。查询成本归因于用户。通过分配给用户的对象标签,您可以按部门细分成本。
由不同部门的用户共享的应用程序或工作流: 例如,代表其用户发出查询的应用程序。在这种情况下,应用程序执行的每个查询都会获分配一个查询标签,用于标识代表其进行查询的用户的团队或成本中心。
后续章节将介绍如何在账户中设置对象标签,并提供每个成本归因场景的详细信息。
在 SQL 中按标签查看成本¶
您可以对账户内的成本或组织内各账户的成本进行归因:
对账户内的成本进行归因
您可以通过查询以下 ACCOUNT_USAGE 架构中的视图来对账户内的成本进行归因:
TAG_REFERENCES 视图:标识具有标签的对象(例如,仓库和用户)。
WAREHOUSE_METERING_HISTORY 视图:提供仓库的 Credit 使用量。
QUERY_ATTRIBUTION_HISTORY 视图:提供查询的计算成本。每查询成本是执行查询的仓库 Credit 使用量。
有关使用此视图的更多信息,请参阅 关于 QUERY_ATTRIBUTION_HISTORY 视图。
对组织内各账户的成本进行归因
在组织内,您还可以通过从 组织账户 查询 ORGANIZATION_USAGE 架构中的视图,对 仅由单个部门 使用的资源的成本进行归因。
备注
在 ORGANIZATION_USAGE 架构中,TAG_REFERENCES 视图仅在组织账户中可用。
QUERY_ATTRIBUTION_HISTORY 视图仅在账户的 ACCOUNT_USAGE 架构中可用。没有组织级别的等效视图。
后续章节将介绍如何为一些 常见的成本归因场景 归因成本:
需要将成本归因于不同部门的应用程序使用的资源¶
本节中的示例计算了由 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 |
+-------------------------+--------------------+
在 Snowsight 中按标签查看成本¶
可以根据具有 cost_center
标签的资源的使用情况生成报告,以将成本归因。您可以在 Snowsight 中访问相关数据。
切换到具有 :ref:` ACCOUNT_USAGE 架构访问权限 <label-enabling_usage_for_other_roles>` 的角色。
导航到 Admin » Cost Management。
选择 Consumption。
从 Tags 下拉列表中选择
cost_center
标签。要关注特定成本中心,请从标签的值列表中选择一个值。
选择 Apply。
有关在 Snowsight 中进行筛选的更多详细信息,请参阅 按标签筛选。
关于 QUERY_ATTRIBUTION_HISTORY 视图¶
您可以使用 QUERY_ATTRIBUTION_HISTORY 视图 根据查询来归因成本。每查询成本是执行查询的仓库 Credit 使用量。此成本不包括因查询执行而产生的任何其他 Credit 使用量。例如,下列内容不包括在查询成本中:
数据传输成本
存储成本
云服务成本
无服务器功能的成本
AI 服务处理的词元的成本
对于并发执行的查询,仓库的成本归因于基于给定时间间隔内资源使用量的加权平均值的单个查询。
每查询成本不包括仓库 空闲时间。空闲时间是在仓库中没有运行查询的时间段,可以在仓库级别进行测量。
其他查询示例¶
后续章节提供了可用于成本归因的其他查询:
对相似查询进行分组¶
对于经常性或类似查询,请使用 query_hash
或:code: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;
有关基于查询 ID 的其他查询,请参阅 示例。
对分层查询成本进行归因¶
对于发出多个层次查询的存储过程,您可以使用程序的根查询 ID 计算程序的归因查询成本。
要查找存储过程的根查询 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;
有关更多信息,请参阅 示例:使用存储过程的祖先查询。
要计算整个程序的查询成本之和,请替换
<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);