自定义预算

自定义预算允许您监控一组自定义对象的计算成本。您可以通过以下两种方式指定要监视的对象:

  • 将标签添加预算中。所有具有指定标签/值对的对象都会受到预算的监控。

  • 将每个对象分别添加到预算中。

相同的预算可以跟踪单独添加和使用标签添加的对象。如果某个对象由于多个原因已包含在预算中(例如,它是单独添加的,并且具有指定的标签/值对),则其 Credit 使用量仅会计入预算的支出限额一次。

将对象添加到自定义预算后,预算会监控对象的所有计算成本,包括后台维护操作和无服务器功能。例如,如果将表添加到自定义预算中,且表已启用自动聚类,则预算会监控自动聚类后台维护的 Credit 使用量。

使用标签监控对象

标签 可以应用于预算,以监控属于账户内逻辑单元的对象的 Credit 使用量。假设您使用 cost_center 标签来跟踪组织内成本中心产生的成本。您可以使用标签/值对 cost_center = 'sales' 标记归因于销售团队的所有对象。您可以简单地添加标签/值对 cost_center = 'sales',而不是将销售团队使用的每个对象单独添加到预算中,预算将自动监控分配给该标签/值对的所有对象的 Credit 使用量。

标签继承

向预算中添加标签会跟踪所有带有该标签的对象,包括从父对象继承该标签的对象。例如,如果数据库有标签,则数据库中的表将继承该标签,并将由预算进行跟踪。由于预算基于标签/值对跟踪使用情况,因此如果您在表级别上覆盖标签的值,则预算跟踪与表相关的使用情况可能会发生变化。例如,假设您的预算用于跟踪带有标签 team = 'eng' 的对象。如果数据库有标签 team = 'eng',但数据库中的表有标签 team = 'IT',则预算不会监控与该表相关的成本。

在预算的上下文中,标签不是从账户继承的,因为账户预算旨在履行该用例。

有关更多信息,包括如何覆盖标签值,请参阅 标签继承

跟踪具有多个预算的对象

多个预算可以添加相同的标签/值对,这意味着超过预算的预算可以跟踪同一对象的 Credit 使用量。例如,假设您将标签 cost_center = 'eng' 添加到 budget_1budget_2 中。由于带有标签的仓库 cost_center = 'eng' 会消耗 Credit,它将计入 budget_1budget_2 的 Credit 限制。

如果一个对象有多个标签,也可以通过多个预算来跟踪该对象。例如,假设一个仓库有两个标签:cost_center = 'finance'stage = 'dev'。您可以创建一个可以跟踪 cost_center = 'finance' 的预算,以及一个可以跟踪 stage = 'dev' 的预算。仓库消耗的 Credit 将计入两个预算的 Credit 限制。

限制和注意事项

使用标签监控对象时,请记住以下几点:

  • 当您更改对象的标签时,更改最多可能需要六个小时才能反映在使用标签的预算中。

  • 当前,无法使用标签监控计算池和警报。您必须单独添加它们。

  • 当月前两天内标签的变更会反映在前一个月的使用量中。

自定义预算的受支持对象

您可以创建自定义预算来监控以下类型的 Snowflake 对象:

对象

监控成本

警报

无服务器警报由账户预算监控。要监控使用用户管理仓库执行的警报的 Credit 使用量,您必须将仓库添加到预算中。有关警报成本的更多信息,请参阅 了解警报的成本

应用程序 . (Snowflake Native Apps)

由 Snowflake Native App 创建和拥有的对象的预算行为取决于是直接添加应用程序还是通过添加标签来添加应用程序。

  • 当您使用标签向预算中添加 Snowflake Native App 时,无论是否共享,都只会自动跟踪标签/值组合相匹配的仓库。

  • 当您将 Snowflake Native App 直接添加到预算中时,所有消耗 Credit 并由应用程序创建和拥有的对象都将自动添加到预算中。这包括应用程序拥有的仓库和 Snowpark Container Services 计算池。预算不会自动跟踪共享的仓库和计算池,但您可以手动添加它们。

    您不能将应用程序创建和拥有的对象添加到单独的预算中。您可以添加共享到单独预算的仓库和计算池。

    要确定仓库或计算池是否归应用程序所有,请检查以下内容:

    • 对于仓库,请运行 SHOW WAREHOUSES 命令。如果 owner_role_type 列中的值为 APPLICATION,则仓库归 Snowflake Native App 所有。

    • 对于计算池,请运行 SHOW COMPUTE POOLS 命令。如果 application 列中的值不是 NULL,则计算池归 Snowflake Native App 所有。

计算池

Snowpark Container Services 的计算池使用情况。有关更多信息,请参阅 计算池成本

数据库

在预算中添加数据库时,数据库包含的所有受支持对象也会自动添加。预算会监控以下对象和无服务器功能的 Credit 使用量:

  • 上述受支持的架构对象。

  • 辅助(副本)数据库的复制。

    备注

    复制或故障转移组中复制的辅助数据库的复制成本,只能由账户预算来监控。

物化视图

物化视图的后台维护。有关更多信息,请参阅 物化视图成本

架构

在预算中添加架构时,架构包含的所有受支持对象也会自动添加。如上所述,预算会监控架构对象的 Credit 使用量。

管道

使用 Snowpipe 加载数据的资源消耗。有关更多信息,请参阅 Snowpipe 成本

自动聚类搜索优化 的后台维护操作(如果已在表上启用)。

任务

Serverless Task 由自定义预算监控。要监控使用用户管理仓库执行的任务的 Credit 使用量,您必须将仓库添加到预算中。有关更多信息,请参阅 任务成本

仓库

用于查询执行、Web 界面和其他功能(请参阅 虚拟仓库 Credit 使用量)、Serverless Task 和 云服务计算 的计算资源。

有关更多信息,请参阅 在自定义预算中添加或移除标签

创建自定义预算

接下来的各部分将介绍如何创建自定义预算:

您可以使用 Snowsight 或通过执行 SQL 语句来创建自定义预算。

创建自定义角色以创建预算

您可以使用自定义角色在账户中创建预算。有关创建自定义预算必须授予角色的权限和角色的完整列表,请参阅 Budgets 角色和权限

以下示例创建一个名为 budget_owner 的角色,并授予所需的角色和权限,以在架构 budgets_db.budgets_schema 中创建自定义预算。该示例必须使用 ACCOUNTADMIN 角色执行:

USE ROLE ACCOUNTADMIN;
   
CREATE ROLE budget_owner;
  
GRANT USAGE ON DATABASE budgets_db TO ROLE budget_owner;
GRANT USAGE ON SCHEMA budgets_db.budgets_schema TO ROLE budget_owner;

GRANT DATABASE ROLE SNOWFLAKE.BUDGET_CREATOR TO ROLE budget_owner;

GRANT CREATE SNOWFLAKE.CORE.BUDGET ON SCHEMA budgets_db.budgets_schema
  TO ROLE budget_owner;
Copy

如果要启用预算所有者以外的角色来修改自定义预算的设置,则可以创建具有修改权限的自定义角色。有关更多信息,请参阅 创建自定义角色以管理自定义预算

使用 Snowsight 创建自定义预算

备注

如果账户预算未 激活 或已停用,则无法使用 Snowsight 创建自定义预算。但是,您可以使用 SQL 创建自定义预算

  1. 登录 Snowsight。

  2. 选择 Admin » Cost Management

  3. 选择 Budgets

  4. 选择 加号图标 (Add Budget)。

  5. 输入 Budget name

  6. 选择要在其中创建预算的数据库和架构。

  7. 输入 Spending limit

  8. 输入用于接收通知的电子邮件地址。

    备注

    添加以用于接收预算通知的每个电子邮件地址都必须 经过验证。如果列表中的电子邮件地址 经过验证,则通知电子邮件设置会失败。

  9. 选择 + Tag & resources,然后添加要添加到自定义预算的标签和资源。

    备注

    • 当您选择数据库或架构时,数据库或架构中包含的所有 受支持对象 (例如,表)也会添加到预算中。

    • 如果您直接添加个别对象,则只能将对象添加到一个自定义预算。在这种情况下,如果对象当前包含在一个自定义预算中,并且您将该对象添加到第二个自定义预算中,则 Budgets 将从第一个自定义预算中移除该对象,而不会发出警告。此行为不适用于使用标签将对象添加到预算中;如果您使用标签将对象添加到预算中,则具有一个或多个标签的对象可以包含在多个自定义预算中。

创建和设置自定义预算后,您可以创建自定义角色,使非账户管理员能够监控预算资源和使用情况。有关更多信息,请参阅 创建自定义角色以监控自定义预算

使用 SQL 命令创建自定义预算

创建自定义预算,然后设置支出限额和通知电子邮件地址。

备注

  1. 查看账户中的现有预算:

    备注

    以下语句会返回您具有访问权限的预算。只有具有 ACCOUNTADMIN 角色的用户才能查看账户中的所有预算。

    SELECT SYSTEM$SHOW_BUDGETS_IN_ACCOUNT();
    
    Copy
  2. 使用 CREATE BUDGET 命令在 budgets_db.budgets_schema 中创建预算 my_budget

    USE SCHEMA budgets_db.budgets_schema;
    
    CREATE SNOWFLAKE.CORE.BUDGET my_budget();
    
    Copy
  3. 设置每月支出限额。例如,将支出限额设置为每月 500 个 Credit:

    CALL my_budget!SET_SPENDING_LIMIT(500);
    
    Copy
  4. 设置预算通知,以便在 Credit 使用量预计超过支出限额时接收通知。

    请参阅 预算通知

创建和设置自定义预算后,您可以创建自定义角色,使非账户管理员能够监控预算资源和使用情况。有关更多信息,请参阅 创建自定义角色以监控自定义预算

要将对象添加到新预算,请参阅 从自定义预算中添加或移除对象

创建自定义角色以管理自定义预算

要监控和修改自定义预算,您可以将权限和实例角色授予自定义角色。有关修改自定义预算必须授予角色的权限和角色的完整列表,请参阅 Budgets 角色和权限

自定义角色示例

授予自定义角色 budget_admin 在架构 budgets_db.budgets_schema 中监控和修改预算 my_budget 的能力:

备注

您需要拥有自定义预算的 OWNERSHIP 权限才能执行以下示例。

  • 为架构 budgets_db.budgets_schema 中预算 my_budget 的自定义角色 budget_admin 授予所需的权限和实例角色:

    GRANT USAGE ON DATABASE budgets_db TO ROLE budget_admin;
    
    GRANT USAGE ON SCHEMA budget_db.budgets_schema TO ROLE budget_admin;
    
    GRANT SNOWFLAKE.CORE.BUDGET ROLE budgets_db.budgets_schema.my_budget!ADMIN
       TO ROLE budget_admin;
    
    GRANT DATABASE ROLE SNOWFLAKE.USAGE_VIEWER TO ROLE budget_admin;
    
    Copy
  • 向要在其中添加或移除自定义预算的对象和标签授予 APPLYBUDGET 权限。添加或移除每个对象或标签都需要执行此步骤。

    例如,要启用角色 budget_admin,以将数据库 db1 添加到自定义预算 my_budget,请执行以下语句:

    GRANT USAGE ON DATABASE db1 TO ROLE budget_admin;
    
    GRANT APPLYBUDGET ON DATABASE db1 TO ROLE budget_admin;
    
    Copy

在自定义预算中添加或移除标签

您可以使用 Snowsight 或 SQL 在自定义预算中添加或移除标签。添加到预算中的每个标签都包含一个或多个标签值。

备注

要在自定义预算中添加或移除标签,您必须使用具有预算和标签的所需权限的角色。有关更多信息,请参阅 创建自定义角色以管理自定义预算

使用 Snowsight 从自定义预算中添加或移除标签

  1. 登录 Snowsight。

  2. 选择 Admin » Cost Management

  3. 选择 Budgets

  4. 选择要编辑的预算。

  5. 在仪表板中,选择 |sf-pencil-icon|(编辑图标)。

  6. 选择 + Tags & resources

  7. 展开 Tags 并导航到要添加的标签。

  8. 执行下列操作之一:

    • 如果标签包含 允许值列表,请选择一个或多个值。

    • 如果可以将标签设置为任何值,请指定该值。

  9. 选择 Done

备注

在向 Snowsight 中的预算添加标签时,请记住以下几点:

  • 必须先将标签应用于至少一个对象,然后才能将其添加到预算中。

  • 将标签添加到对象后,最多可能需要两个小时才能显示该标签。

使用 SQL 命令从自定义预算中添加或移除标签

用于从预算中添加或移除标签的角色必须具有该标签的 APPLYBUDGET 权限。有关更多信息,请参阅 创建自定义角色以管理自定义预算 部分中的示例。

要查看已在自定义预算中的标签列表,请调用预算的 <budget_name>!GET_LINKED_TAGS 方法。例如,要查看 budgets_db.budgets_schema 架构中预算 my_budget 中的标签列表,请执行以下语句:

CALL budgets_db.budgets_schema.my_budget!GET_LINKED_TAGS();
Copy

标签必须通过 引用 添加到预算或从其中移除。

  1. 您可以按照以下步骤操作,将标签 cost_mgmt_db.tags.cost_center 添加到预算 my_budget

    1. 通过执行以下语句将标签的 APPLYBUDGET 权限授予角色 budget_admin

      GRANT APPLYBUDGET ON TAG cost_center TO ROLE budget_admin;
      
      Copy
    2. 通过执行以下语句,将对标签 cost_center 的引用传递给 ADD_TAG 实例方法:标签的值设置为 finance

      CALL budgets_db.budgets_schema.my_budget!ADD_TAG(
         SELECT SYSTEM$REFERENCE('TAG',
            'cost_mgmt_db.tags.cost_center',
            'SESSION',
            'applybudget'),
            'finance');
      
      Copy

      SYSTEM$REFERENCE 函数创建对 cost_center 标签的引用,授予对标签的 APPLYBUDGET 权限。这使预算能够监控在您的账户中具有指定标签/值对的对象。函数的第三个参数指定引用的作用域,在本例中,“SESSION”创建具有会话作用域的引用。传递给预算的 ADD_TAG 方法的引用可以使用任意瞬态引用作用域(也就是说,第三个参数可以是“SESSION”或“CALL”)创建。

  2. 您可以按照以下步骤操作,从预算 my_budget 中移除标签 cost_center

    1. 通过执行以下语句将数据库的 APPLYBUDGET 权限授予角色 budget_admin

      GRANT APPLYBUDGET ON TAG cost_center TO ROLE budget_admin;
      
      Copy
    2. 通过向 REMOVE_TAG 实例方法传递引用来移除标签:

      CALL budgets_db.budgets_schema.my_budget!REMOVE_TAG(
         SELECT SYSTEM$REFERENCE('TAG',
            'cost_mgmt_db.tags.cost_center',
            'SESSION',
            'applybudget'),
            'finance');
      
      Copy

从自定义预算中添加或移除对象

您可以使用 Snowsight 或 SQL 在自定义预算中添加或移除对象。

备注

要在自定义预算中添加或移除对象,您必须使用具有预算和对象的所需权限的角色。有关更多信息,请参阅 创建自定义角色以管理自定义预算

使用 Snowsight 从自定义预算中添加或移除对象

  1. 登录 Snowsight。

  2. 选择 Admin » Cost Management

  3. 选择 Budgets

  4. 选择要编辑的预算。

  5. 在仪表板中,选择 |sf-pencil-icon|(编辑图标)。

  6. 选择 + Tags & resources,然后选择要添加到自定义预算的对象。

    备注

    • 当您选择数据库或架构时,数据库或架构中包含的所有 受支持对象 (例如,表)也会添加到预算中。

    • 如果您直接添加个别对象,则只能将对象添加到一个自定义预算。在这种情况下,如果对象当前包含在一个自定义预算中,并且您将该对象添加到第二个自定义预算中,则 Budgets 将从第一个自定义预算中移除该对象,而不会发出警告。此行为不适用于使用标签将对象添加到预算中;如果您使用标签将对象添加到预算中,则具有一个或多个标签的对象可以包含在多个自定义预算中。

  7. 选择 Done

使用 SQL 命令从自定义预算中添加或移除对象

用于从预算中添加或移除对象的角色必须具有该对象的 APPLYBUDGET 权限。有关更多信息,请参阅 创建自定义角色以管理自定义预算 部分中的示例。

要查看已在自定义预算中的对象列表,请调用预算的 <budget_name>!GET_LINKED_RESOURCES 方法。例如,要查看 budgets_db.budgets_schema 架构中预算 my_budget 中的对象列表,请执行以下语句:

CALL budgets_db.budgets_schema.my_budget!GET_LINKED_RESOURCES();
Copy

该语句返回以下输出:

+-------------+-----------------+-----------+-------------+---------------+
| RESOURCE_ID | NAME            | DOMAIN    | SCHEMA_NAME | DATABASE_NAME |
|-------------+-----------------+-----------+-------------+---------------|
|         326 | DB1             | DATABASE  | NULL        | NULL          |
|         157 | MY_WH           | WAREHOUSE | NULL        | NULL          |
+-------------+-----------------+-----------+-------------+---------------+

备注

该列表不包括:

  • 自动添加的对象(例如,由 Snowflake Native App 创建和拥有的计算池和仓库)。

  • 在预算中添加了标签时添加的对象。

对象必须通过 引用 添加到预算或从其中移除。

  1. 您可以按照以下步骤操作,将表 t1 添加到预算 my_budget

    1. 通过执行以下语句将表的 APPLYBUDGET 权限授予角色 budget_admin

      GRANT APPLYBUDGET ON TABLE t1 TO ROLE budget_admin;
      
      Copy
    2. 通过执行以下语句,将对表 t1 的引用传递给 ADD_RESOURCE 实例方法:

      CALL budgets_db.budgets_schema.my_budget!ADD_RESOURCE(
         SELECT SYSTEM$REFERENCE('TABLE', 't1', 'SESSION', 'applybudget'));
      
      Copy

      SYSTEM$REFERENCE 函数创建对 TABLE 对象 t1 的引用,授予对表的 APPLYBUDGET 权限。这使预算能够监控您的账户中的指定对象。函数的第三个参数指定引用的作用域,在本例中,“SESSION”创建具有会话作用域的引用。传递给预算的 ADD_RESOURCE 方法的引用可以使用任意瞬态引用作用域(也就是说,第三个参数可以是“SESSION”或“CALL”)创建。

      备注

      如果您想在预算中添加 Snowflake Native App,当您调用 SYSTEM$REFERENCE 时,请为 object_type 实参指定 'DATABASE'``(而不是 ``'APPLICATION')。

      有关对象和权限的完整列表,请参阅 支持的引用对象类型和权限

      备注

      如果您直接添加个别对象,则只能将对象添加到一个自定义预算。在这种情况下,如果对象当前包含在一个自定义预算中,并且您将该对象添加到第二个自定义预算中,则 Budgets 将从第一个自定义预算中移除该对象,而不会发出警告。此行为不适用于使用标签将对象添加到预算中;如果您使用标签将对象添加到预算中,则具有一个或多个标签的对象可以包含在多个自定义预算中。

  2. 您可以按照以下步骤操作,从预算 my_budget 中移除数据库 db1

    1. 通过执行以下语句将数据库的 APPLYBUDGET 权限授予角色 budget_admin

      GRANT APPLYBUDGET ON DATABASE db1 TO ROLE budget_admin;
      
      Copy
    2. 通过向 REMOVE_RESOURCE 实例方法传递引用来移除数据库:

      CALL budgets_db.budgets_schema.my_budget!REMOVE_RESOURCE(
         SELECT SYSTEM$REFERENCE('DATABASE', 'db1', 'SESSION', 'applybudget'));
      
      Copy
语言: 中文