Atribuição do custo

Uma organização pode distribuir o custo de uso do Snowflake para unidades lógicas dentro da organização (por exemplo, para diferentes departamentos, ambientes ou projetos). Esse modelo de chargeback ou showback é útil para fins contábeis e aponta as áreas da organização que poderiam se beneficiar de controles e otimizações que podem reduzir os custos.

Para atribuir custos a diferentes grupos, como departamentos ou projetos, use a seguinte abordagem recomendada:

  • Use as tags de objeto para associar recursos e usuários a departamentos ou projetos.

  • Use as tags de consulta para associar consultas individuais a departamentos ou projetos quando as consultas forem feitas pelo mesmo aplicativo em nome de usuários pertencentes a vários departamentos.

Tipos de cenários de atribuição de custos

Os cenários de atribuição de custos a seguir são os mais comumente encontrados. Nesses cenários, os warehouses são usados como exemplo de um recurso que incorre em custos.

  • Recursos usados exclusivamente por um único centro de custo ou departamento: um exemplo disso é o uso de tags de objeto para associar warehouses a um departamento. Você pode usar essas tags de objeto para atribuir os custos incorridos por esses warehouses a esse departamento.

  • Recursos compartilhados por usuários de vários departamentos: um exemplo disso é um warehouse compartilhado por usuários de diferentes departamentos. Nesse caso, você usa tags de objeto para associar cada usuário a um departamento. Os custos das consultas são atribuídos aos usuários. Usando as tags de objeto atribuídas aos usuários, você pode decompor os custos por departamento.

  • Aplicativos ou fluxos de trabalho compartilhados por usuários de diferentes departamentos: um exemplo disso é um aplicativo que emite consultas em nome de seus usuários. Nesse caso, a cada consulta executada pelo aplicativo é atribuída uma tag de consulta que identifica a equipe ou o centro de custo do usuário em cujo nome a consulta está sendo feita.

As próximas seções explicam como configurar tags de objeto em suas contas e fornecem os detalhes de cada um desses cenários de atribuição de custos.

Configuração de tags de objeto para atribuição de custos

Ao configurar tags para representar os agrupamentos que deseja usar para a atribuição de custos, você deve determinar se os agrupamentos se aplicam a uma única conta ou a várias contas. Isso determina como você configura suas tags.

Por exemplo, suponha que você queira atribuir custos com base no departamento.

  • Se os recursos usados pelo departamento estiverem localizados em uma única conta, você cria as tags em um banco de dados nessa conta.

  • Se os recursos usados pelo departamento abrangerem várias contas, você cria as tags em uma conta-chave da organização (por exemplo, na conta da organização) e disponibiliza essas tags em outras contas por meio de replicação.

As próximas seções explicam como criar tags, replicar tags e aplicar tags aos recursos.

Nota

Os exemplos nestas seções usam a função personalizada tag_admin, que supostamente recebeu os privilégios para criar e gerenciar tags. Em sua organização, você pode usar privilégios mais granulares para marcação de objetos para desenvolver uma estratégia de marcação segura.

Criação de tags

Como parte do projeto da estratégia, decida o banco de dados e esquema em que planeja criar as tags.

  • Você pode criar um banco de dados e um esquema dedicados para as tags.

  • Se quiser marcar recursos em diferentes contas da organização, você pode criar as marcas em uma conta-chave da organização (por exemplo, na conta da organização).

O exemplo a seguir cria um banco de dados chamado cost_management e um esquema chamado tags para as tags que você planeja usar:

USE ROLE tag_admin;

CREATE DATABASE cost_management;
CREATE SCHEMA tags;
Copy

Com cost_management e tags selecionados como o banco de dados e o esquema atuais, crie uma tag chamada cost_center e defina os valores permitidos para a tag como os nomes dos centros de custo:

CREATE TAG cost_center
  ALLOWED_VALUES 'finance', 'marketing', 'engineering', 'product';
Copy

Replicação do banco de dados de tags

Se você tiver uma organização com várias contas e quiser disponibilizar as tags nessas outras contas, configure suas contas para replicação e crie um grupo de replicação em uma conta principal (por exemplo, na conta da organização). Configure esse grupo de replicação para replicar o banco de dados que contém as tags.

Replique o banco de dados que contém as tags de objeto

Por exemplo, para replicar as tags para as contas denominadas my_org.my_account e my_org.my_account_2, execute esta instrução em sua conta da organização:

CREATE REPLICATION GROUP cost_management_repl_group
  OBJECT_TYPES = DATABASES
  ALLOWED_DATABASES = cost_management
  ALLOWED_ACCOUNTS = my_org.my_account_1, my_org.my_account_2
  REPLICATION_SCHEDULE = '10 MINUTE';
Copy

Em seguida, em cada conta na qual deseja disponibilizar as tags, crie um grupo de replicação secundário e atualize esse grupo a partir do grupo primário:

CREATE REPLICATION GROUP cost_management_repl_group
  AS REPLICA OF my_org.my_org_account.cost_management_repl_group;

ALTER REPLICATION GROUP cost_management_repl_group REFRESH;
Copy

Marcação de recursos e usuários

Após criar e replicar as tags, você pode usá-las para identificar os warehouses e usuários pertencentes a cada departamento. Por exemplo, como o departamento de vendas usa tanto warehouse1 quanto warehouse2, você pode definir a tag cost_center como 'SALES' para ambos os warehouses.

Dica

O ideal é que você tenha fluxos de trabalho que automatizem o processo de aplicação dessas tags ao criar recursos e usuários.

USE ROLE tag_admin;

ALTER WAREHOUSE warehouse1 SET TAG cost_management.tags.cost_center='SALES';
ALTER WAREHOUSE warehouse2 SET TAG cost_management.tags.cost_center='SALES';
ALTER WAREHOUSE warehouse3 SET TAG cost_management.tags.cost_center='FINANCE';

ALTER USER finance_user SET TAG cost_management.tags.cost_center='FINANCE';
ALTER USER sales_user SET TAG cost_management.tags.cost_center='SALES';
Copy

Exibição de custo por tag em SQL

Você pode atribuir custos dentro de uma conta ou entre contas em uma organização:

  • Atribuição de custos em uma conta

    Você pode atribuir custos em uma conta consultando as seguintes exibições no esquema ACCOUNT_USAGE:

  • Atribuição de custos entre contas em uma organização

    Em uma organização, você também pode atribuir custos a recursos que são usados exclusivamente por um único departamento consultando exibições no esquema ORGANIZATION_USAGE a partir da conta de organização.

    Nota

    • No esquema ORGANIZATION_USAGE, a exibição TAG_REFERENCES só está disponível na conta de organização.

    • A exibição QUERY_ATTRIBUTION_HISTORY só está disponível no esquema ACCOUNT_USAGE para uma conta. Não existe um equivalente da exibição em toda a organização.

As próximas seções explicam como atribuir custos para alguns dos cenários comuns de atribuição de custos:

Recursos não compartilhados pelos departamentos

Suponha que você queira atribuir custos por departamento e que cada departamento use um conjunto de warehouses dedicados.

Se você marcar os warehouses com uma tag cost_center para identificar o departamento proprietário do warehouse, poderá unir ACCOUNT_USAGE Exibição TAG_REFERENCES com Exibição WAREHOUSE_METERING_HISTORY nas colunas object_id e warehouse_id para obter informações de uso por warehouse, e poderá usar a coluna tag_value para identificar os departamentos proprietários desses warehouses.

Unindo TAG_REFERENCES e WAREHOUSE_METERING_HISTORY para atribuir custos para warehouses dedicados

A seguinte instrução SQL realiza essa junção:

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;
Copy
+-------------+-------------+-----------------+
| TAG_NAME    | TAG_VALUE   |   TOTAL_CREDITS |
|-------------+-------------+-----------------|
| NULL        | untagged    |    20.360277159 |
| COST_CENTER | Sales       |    17.173333333 |
| COST_CENTER | Finance     |      8.14444444 |
+-------------+-------------+-----------------+

Você pode executar uma consulta semelhante para realizar a mesma atribuição para todas as contas de sua organização usando exibições no esquema ORGANIZATION_USAGE da conta de organização. O restante da consulta não é alterado.

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;
Copy

Recursos compartilhados por usuários de diferentes departamentos

Suponha que usuários de diferentes departamentos compartilhem os mesmos warehouses e você queira dividir os créditos usados por cada departamento. Você pode marcar os usuários com uma tag cost_center para identificar o departamento ao qual eles pertencem e juntar Exibição TAG_REFERENCES com Exibição QUERY_ATTRIBUTION_HISTORY.

Nota

Você só pode obter esses dados para uma única conta de cada vez. Você não pode executar uma consulta que recupere esses dados em todas as contas de uma organização.

Unindo TAG_REFERENCES e WAREHOUSE_METERING_HISTORY para atribuir custos para warehouses compartilhados

As próximas seções fornecem exemplos de instruções SQL para atribuição de custos de recursos compartilhados.

Cálculo do custo das consultas de usuário no último mês

A instrução SQL a seguir calcula os custos do último mês.

Neste exemplo, o tempo ocioso do é distribuído entre os usuários proporcionalmente ao seu uso.

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;
Copy
+-----------+--------------------+
| USER_NAME | ATTRIBUTED_CREDITS |
|-----------+--------------------+
| FINUSER   | 6.603575468        |
| SALESUSER | 4.321378049        |
| ENGUSER   | 0.6217131392       |
|-----------+--------------------+

Cálculo do custo de consultas de usuários por departamento sem tempo ocioso

O exemplo a seguir atribui o custo de computação a cada departamento por meio das consultas executadas pelos usuários desse departamento. Essa consulta depende de os objetos do usuário terem uma tag que identifique seu departamento.

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;
Copy
+-------------+-------------+-----------------+
| TAG_NAME    | TAG_VALUE   |   TOTAL_CREDITS |
|-------------+-------------+-----------------|
| COST_CENTER | engineering |   0.02493688426 |
| COST_CENTER | finance     |    0.2281084988 |
| COST_CENTER | marketing   |    0.3686840545 |
|-------------+-------------+-----------------|

Cálculo do custo das consultas feitas por usuários sem tempo ocioso

A instrução SQL a seguir calcula os custos por usuário no último mês (excluindo o tempo ocioso).

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;
Copy
+-----------+--------------------+
| USER_NAME | ATTRIBUTED_CREDITS |
|-----------+--------------------|
| JSMITH    |       17.173333333 |
| MJONES    |         8.14444444 |
| SYSTEM    |         5.33985393 |
+-----------+--------------------+

Cálculo do custo das consultas feitas por usuários sem tags

O exemplo a seguir calcula o custo das consultas feitas por usuários que não estão marcados. Você pode usar isso para verificar se as tags estão sendo aplicadas de forma consistente aos usuários.

SELECT qah.user_name, SUM(qah.credits_attributed_compute) as total_credits
  FROM
    SNOWFLAKE.ACCOUNT_USAGE.QUERY_ATTRIBUTION_HISTORY qah
    LEFT JOIN snowflake.account_usage.tag_references tr
    ON qah.user_name = tr.object_name AND tr.DOMAIN = 'USER'
  WHERE
    start_time >= dateadd(month, -1, current_date)
    AND qah.user_name IS NULL OR tr.object_name IS NULL
  GROUP BY qah.user_name
  ORDER BY total_credits DESC;
Copy
+------------+---------------+
| USER_NAME  | TOTAL_CREDITS |
|------------+---------------|
| RSMITH     |  0.1830555556 |
+------------+---------------+

Recursos usados por aplicativos que precisam atribuir custos a diferentes departamentos

Os exemplos desta seção calculam os custos de um ou mais aplicativos alimentados pelo Snowflake.

Os exemplos pressupõem que esses aplicativos definem tags de consulta que identificam o aplicativo para todas as consultas executadas. Para definir a tag de consulta para consultas em uma sessão, execute o comando ALTER SESSION. Por exemplo:

ALTER SESSION SET QUERY_TAG = 'COST_CENTER=finance';
Copy

Isso associa a tag COST_CENTER=finance a todas as consultas subsequentes executadas durante a sessão.

Você pode então usar a tag de consulta para rastrear o custo incorrido por essas consultas até os departamentos apropriados.

As próximas seções fornecem exemplos de uso dessa abordagem.

Cálculo do custo de consultas por departamento

O exemplo a seguir calcula os créditos de computação e os créditos usados para o serviço de aceleração da consulta para o departamento financeiro. Isso depende da tag de consulta COST_CENTER=finance que está sendo aplicada às consultas originais que foram executadas.

Observe que os custos excluem o tempo ocioso.

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;
Copy
+---------------------+-----------------+------+
| QUERY_TAG           | COMPUTE_CREDITS | QAS  |
|---------------------+-----------------|------|
| COST_CENTER=finance |      0.00576115 | null |
+---------------------+-----------------+------+

Cálculo do custo das consultas (excluindo o tempo ocioso) por tag de consulta

O exemplo a seguir calcula o custo das consultas por tag de consulta e inclui consultas sem tags (identificadas como “untagged”).

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;
Copy
+-------------------------+-----------------+------+
| TAG                     | COMPUTE_CREDITS | QAS  |
|-------------------------+-----------------+------+
| untagged                | 3.623173449     | null |
| COST_CENTER=engineering | 0.531431948     | null |
|-------------------------+-----------------+------+

Cálculo do custo das consultas (incluindo o tempo ocioso) por tag de consulta

O exemplo a seguir distribui o tempo ocioso que não é capturado no custo por consulta entre os departamentos, proporcionalmente ao uso que fazem do warehouse.

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;
Copy
+-------------------------+--------------------+
| TAG                     | ATTRIBUTED_CREDITS |
+-------------------------+--------------------|
| untagged                |        9.020031304 |
| COST_CENTER=finance     |        1.027742521 |
| COST_CENTER=engineering |        1.018755812 |
| COST_CENTER=marketing   |       0.4801370376 |
+-------------------------+--------------------+

Exibição de custo por tag no Snowsight

Você pode atribuir custos informando sobre o uso de recursos que tenham a tag cost_center. Você pode acessar esses dados no Snowsight.

  1. Mude para uma função que tenha acesso ao esquema ACCOUNT_USAGE.

  2. Navegue até Admin » Cost Management.

  3. Selecione Consumption.

  4. No menu suspenso Tags, selecione a tag cost_center.

  5. Para se concentrar em um centro de custo específico, selecione um valor da lista de valores da tag.

  6. Selecione Apply.

Para obter mais detalhes sobre filtragem em Snowsight, consulte Como filtrar por tag.

Sobre a exibição QUERY_ATTRIBUTION_HISTORY

Você pode usar o Exibição QUERY_ATTRIBUTION_HISTORY para atributo custo com base em consultas. O custo por consulta é o uso de crédito do warehouse para executar a consulta. Esse custo não inclui nenhum outro uso de crédito incorrido como resultado da execução da consulta. Por exemplo, os seguintes itens não estão incluídos no custo da consulta:

  • Custos de transferência de dados

  • Custos de armazenamento

  • Custos dos serviços de nuvem

  • Custos para recursos sem servidor

  • Custos para tokens processados por serviços de AI

Para consultas executadas simultaneamente, o custo do warehouse é atribuído a consultas individuais com base na média ponderada do consumo de recursos durante um determinado intervalo de tempo.

O custo por consulta não inclui o tempo ocioso do warehouse. O tempo ocioso é um período em que nenhuma consulta está em execução no warehouse e pode ser medido no nível do warehouse.

Exemplos adicionais de consultas

As próximas seções fornecem consultas adicionais que você pode usar para a atribuição de custos:

Agrupamento de consultas semelhantes

Para consultas recorrentes ou semelhantes, use o query_hash ou query_parameterized_hash para agrupar custos por consulta.

Para encontrar as consultas recorrentes mais caras do mês atual, execute a seguinte instrução:

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;
Copy

Para uma consulta adicional baseada no ID de consulta, consulte Exemplos.

Atribuição de custos de consultas hierárquicas

Para procedimentos armazenados que emitem várias consultas hierárquicas, você pode calcular os custos de consulta atribuídos para o procedimento usando o ID de consulta raiz para o procedimento.

  1. Para encontrar o ID de consulta raiz de um procedimento armazenado, use o Exibição ACCESS_HISTORY. Por exemplo, para encontrar o ID de consulta raiz de um procedimento armazenado, defina o query_id e execute as seguintes instruções:

    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;
    
    Copy

    Para obter mais informações, consulte Exemplo: consultas antigas com procedimentos armazenados.

  2. Para somar o custo da consulta para todo o procedimento, substitua <root_query_id> e execute as seguintes instruções:

    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);
    
    Copy