控制成本¶
本主题讨论了可用于限制 虚拟仓库 使用花费的 控制措施。这些控制措施有助于确保使用虚拟仓库的实际成本不超过预期成本。
本主题内容:
控制对仓库的访问¶
仔细定义谁可以使用仓库以及他们可以对这些仓库执行哪些操作,将计算资源的使用限制在配置经济实惠的已知仓库上,从而帮助控制成本。Snowflake 的精细 访问控制 允许您为仓库授予以下权限:
CREATE WAREHOUSE – 全局权限(即对账户授予)限制哪些角色可以创建新仓库,从而强制个人使用已经存在并设置了成本控制的仓库。
MODIFY – 特定仓库的权限,允许更改影响成本的设置,包括调整仓库大小和禁用 自动暂停 设置。通常,用户会针对特定工作负载增加仓库的大小,然后忘记将其更改回原来的大小,这可能会对成本产生重大影响。
USAGE – 特定仓库的权限,允许激活仓库为查询和其他 SQL 操作提供计算资源。仔细分配此权限可确保用户只能使用大小和配置适合其工作负载的仓库。
将创建和扩展仓库的责任集中给团队中的少数成员是一种最佳实践。您可以创建一个具有创建和修改所有仓库权限的专用角色,然后将该角色授予有限数量的用户。这使您可以控制仓库策略,防止因仓库意外创建或扩大规模而导致意外成本超支。
小技巧
如果您希望能够扩展仓库以处理更苛刻的工作负载,但又不希望用户增加仓库大小,因为他们后续可能会忘记后续调整,可以考虑使用 多集群仓库。多集群仓库会随着工作负载的波动自动扩展。
有关可以为仓库设置的所有权限的列表,请参阅 虚拟仓库权限。
选择最佳仓库大小¶
仓库的大小决定了每小时可花费的最大 credit。例如,小型仓库每小时消耗的 credit 不能超过 2 个。有关仓库大小及其消耗的最大 credit 的完整列表,请参阅 仓库概述。
成本控制的一个最佳实践是针对不同的工作负载使用不同的仓库,这样您可以选择适合每个工作负载的大小。如果您不确定仓库的最佳大小是多少,请从较小的规模开始,然后根据工作负载性能及其 SLA 缓慢增加规模。
有关为工作负载选择合适的仓库的更多信息,请参阅 `管理 Snowflake 计算资源<https://www.snowflake.com/blog/managing-snowflakes-compute-resources>`_ (Snowflake 博客文章)。
限制查询时间¶
挂起的查询会消耗过多的 credit,因为它们的运行时间超出预期。为了避免与失控查询相关的额外成本,您可以设置 STATEMENT_TIMEOUT_IN_SECONDS
参数来定义 SQL 语句在取消之前可以运行的时长上限。
可以为整个账户、用户、会话或特定仓库设置 STATEMENT_TIMEOUT_IN_SECONDS
参数,这样您就可以仔细设置时间限制,使之与各种工作负载的预期运行时间相匹配。默认情况下,此参数在账户级别设置。当为会话之外的仓库设置参数时,将强制使用最低的非零值。
使用以下命令查看当前的查询时间限制:
SHOW PARAMETERS LIKE 'STATEMENT_TIMEOUT_IN_SECONDS' IN ACCOUNT;
SHOW PARAMETERS LIKE 'STATEMENT_TIMEOUT_IN_SECONDS' IN USER <username>;
SHOW PARAMETERS LIKE 'STATEMENT_TIMEOUT_IN_SECONDS' IN SESSION;
SHOW PARAMETERS LIKE 'STATEMENT_TIMEOUT_IN_SECONDS' IN WAREHOUSE <warehouse_name>;
如果您需要调整时间限制,请使用以下命令之一:
ALTER ACCOUNT SET STATEMENT_TIMEOUT_IN_SECONDS = <number_of_seconds>;
ALTER USER <username> SET STATEMENT_TIMEOUT_IN_SECONDS = <number_of_seconds>;
ALTER SESSION SET STATEMENT_TIMEOUT_IN_SECONDS = <number_of_seconds>;
ALTER WAREHOUSE <warehouse_name> SET STATEMENT_TIMEOUT_IN_SECONDS = <number_of_seconds>;
限制语句排队时间¶
在排队等待使用仓库的 SQL 语句不会消耗 credit。但是,如果查询在队列中停留的时间过长,则在执行时它可能不再具有相关性。运行不再相关的查询会浪费 credit,因此您可以通过设置 SQL 语句在取消前排队的最大时间来实施成本控制。
控制 SQL 语句在队列中停留时间的参数是 STATEMENT_QUEUED_TIMEOUT_IN_SECONDS
。可以为整个账户、用户、会话或特定仓库设置此参数。 默认情况下,此参数在账户级别设置。当为会话之外的仓库设置参数时,将强制使用最低的非零值。
使用以下命令查看当前的队列时间限制:
SHOW PARAMETERS LIKE 'STATEMENT_QUEUED_TIMEOUT_IN_SECONDS' IN ACCOUNT;
SHOW PARAMETERS LIKE 'STATEMENT_QUEUED_TIMEOUT_IN_SECONDS' IN USER <username>;
SHOW PARAMETERS LIKE 'STATEMENT_QUEUED_TIMEOUT_IN_SECONDS' IN SESSION;
SHOW PARAMETERS LIKE 'STATEMENT_QUEUED_TIMEOUT_IN_SECONDS' IN WAREHOUSE <warehouse_name>;
如果您需要调整时间限制,请使用以下命令之一:
ALTER ACCOUNT SET STATEMENT_QUEUED_TIMEOUT_IN_SECONDS = <number_of_seconds>;
ALTER USER <username> SET STATEMENT_QUEUED_TIMEOUT_IN_SECONDS = <number_of_seconds>;
ALTER SESSION SET STATEMENT_QUEUED_TIMEOUT_IN_SECONDS = <number_of_seconds>;
ALTER WAREHOUSE <warehouse_name> SET STATEMENT_QUEUED_TIMEOUT_IN_SECONDS = <number_of_seconds>;
使用自动暂停¶
默认情况下,所有仓库都启用了自动暂停设置,这意味着仓库在规定的时间段内处于非活动状态时会自动关闭。暂停的仓库不会消耗 credit,因此该仓库仅在处理工作负载时产生成本。
限制用户禁用自动暂停设置有助于防止未使用的仓库浪费 credit。您可以使用 访问控制 来允许某人使用仓库,但也可以阻止他们修改其自动暂停设置。
查询:查找未启用自动暂停功能的仓库
使用以下查询定期检查是否已禁用任何仓库的自动暂停设置。
SHOW WAREHOUSES
;
SELECT "name" AS WAREHOUSE_NAME
,"size" AS WAREHOUSE_SIZE
FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()))
WHERE IFNULL("auto_suspend",0) = 0;
为已关闭自动暂停功能的仓库启用该功能,请打开 Snowsight 并导航到 Admin » Warehouses。您也可以使用 ALTER WAREHOUSE 命令的 AUTO_SUSPEND
参数。
使用带自动暂停功能的自动恢复¶
通常,每个启用了自动暂停的仓库也应启用自动恢复。这两个设置的组合会在仓库的工作负载波动时自动停止和启动仓库。
查询:查找没有自动恢复功能的仓库
以下查询列出了 未 启用自动恢复的仓库,让您知道哪些仓库需要修改。
SHOW WAREHOUSES
;
SELECT "name" AS WAREHOUSE_NAME
,"size" AS WAREHOUSE_SIZE
FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()))
WHERE "auto_resume" = 'false';
为已关闭的仓库启用自动恢复,请打开 Snowsight 并导航到 Admin » Warehouses。您也可以使用 ALTER WAREHOUSE 命令的 AUTO_RESUME
参数。
强制执行支出限额¶
资源监视器 能够设置仓库在特定时间间隔或日期范围内消耗的 credit 上限。这有助于防止仓库意外消耗超过常规预期的 credit。
有时,资源监视器只是在达到 credit 限额时通知管理员,但您也可以通过配置资源监视器来 强制执行 限额,使其在达到限额后立即暂停仓库。强制执行限额时有两种选择:在待处理的语句执行完毕后暂停仓库,或者立即暂停,而不必等待语句执行完成。
由于可以为多个仓库或整个账户设置单个资源监视器,因此当达到总支出限额时,您可以有效地暂停多个仓库。仓库可以同时分配给自己的资源监视器和账户特定的资源监视器;当达到任一 credit 限额时,该仓库都会被暂停。
有关在达到支出限额时暂停仓库的更多详细信息,请参阅 使用资源监视器。
查询:查找没有资源监视器的仓库
以下查询列出了尚未分配给特定仓库资源监视器的仓库,这些仓库容易成本失控。请注意,该查询不检查账户级别的资源监视器;列表中属于具有账户级资源监视器的账户的仓库仍受 credit 限额的约束。
SELECT "name" AS WAREHOUSE_NAME
,"size" AS WAREHOUSE_SIZE
FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()))
WHERE "resource_monitor" = 'null'
;
备注
即使对由资源监视器暂停的仓库运行查询,Snowflake 架构的云服务层仍然可能产生少量成本。