Atribuição do custo

Uma organização pode obter um insight do custo de utilização do Snowflake atribuindo esses custos a unidades lógicas dentro da organização (por exemplo, departamentos, ambientes e projetos). Este modelo de chargeback ou showback é útil para fins contábeis, mas também permite que uma organização identifique quais unidades estão gastando mais. Este insight ajuda a identificar áreas da organização que poderiam se beneficiar de controles e otimizações a fim de reduzir custos.

Atribuição de custo de recursos individuais

A maneira mais direta e poderosa de atribuir custos a diferentes agrupamentos como departamentos, ambientes ou projetos é marcar recursos específicos usando a função marcação de objetos. Nesta estratégia, um administrador cria uma tag (por exemplo, cost_center), depois define uma lista de valores possíveis da tag (por exemplo, sales, finance). Neste exemplo, cada centro de custo recebe um valor de tag único. A combinação tag/valor é então atribuída aos recursos utilizados por um centro de custo. Como estes recursos consomem créditos, você pode executar relatórios agrupados pelo valor da tag. Como este valor de tag corresponde diretamente a um determinado agrupamento dentro da organização, os custos podem ser atribuídos com precisão.

A marcação de objetos permite atribuir custos com base em algo geral como uma conta ou algo específico como uma tabela. Note que nem todos os objetos marcáveis acumulam custos. Da perspectiva de gerenciamento de custos, a marcação de um objeto só faz sentido se houver uma exibição esquemática que contenha dados de uso ou de custos relacionados a esse objeto. Para uma lista das exibições de custos e uso do Snowflake, consulte Exploração do custo total.

Fluxo de trabalho de atribuição

O uso de tags de objeto para atribuir custos consiste em três tarefas básicas:

  1. Conceber uma estratégia de marcação e criar tags apropriadas.

  2. Marcar recursos com o par correto de tag/valor.

  3. Executar relatórios com base em dados de uso e tags.

Para ajudar a ilustrar este fluxo de trabalho, considere uma conta Snowflake que:

  • Tenha dois centros de custo: Vendas e Finanças.

  • Tenha três warehouses. Vendas usa Warehouse1 e Warehouse2, enquanto o departamento financeiro utiliza Warehouse3.

Três warehouses em uma conta

Neste exemplo, o objetivo é atribuir os custos de warehouse associados a cada warehouse ao departamento apropriado.

Nota

O exemplo a seguir assume que foram concedidos privilégios apropriados para a função tag_admin. Uma organização pode usar as permissões de marcação granulares para desenvolver uma estratégia de marcação segura.

Tarefa 1: Conceber uma estratégia de marcação e criar tags apropriadas

Para este exemplo, um administrador com os devidos privilégios cria uma única tag chamada cost_center.

USE ROLE tag_admin;
USE SCHEMA my_db.my_schema;
CREATE TAG cost_center;
Copy
Tarefa 2: Marcar objetos com o par correto de tag/valor

O administrador da tag aplica o par tag/valor apropriado aos warehouses. Por exemplo, como o departamento de vendas utiliza ambos warehouse1 e warehouse2, a mesma combinação tag/valor é aplicada a estes dois recursos.

USE ROLE tag_admin;
ALTER WAREHOUSE warehouse1 SET TAG cost_center='SALES';
ALTER WAREHOUSE warehouse2 SET TAG cost_center='SALES';
ALTER WAREHOUSE warehouse3 SET TAG cost_center='FINANCE';
Copy

Nota

Se os administradores quiserem controlar quais valores podem ser definidos no objeto, eles podem usar o parâmetro opcional allowed_values ao criar a tag. Para obter mais detalhes, consulte CREATE TAG.

Tarefa 3: Executar relatórios com base em dados de uso e tags.

Você pode atribuir custos informando sobre o uso de recursos que tenham a tag cost_center. Estes dados estão disponíveis em Snowsight ou consultando o esquema SNOWFLAKE.ACCOUNT_USAGE.

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.

SQL:

O esquema Account Usage contém dados sobre o uso de recursos e as tags no esquema. A execução de uma consulta nas exibições neste esquema atribui o consumo de crédito dos warehouses ao centro de custo correto.

USE snowflake.account_usage;

SELECT tag_value AS cost_center,
  SUM(credits_used)
FROM warehouse_metering_history, tag_references
WHERE warehouse_name=object_name
  AND tag_name='COST_CENTER'
GROUP BY 1
ORDER BY 2 DESC;
Copy

A consulta retorna um relatório como:

COST_CENTER

CREDITS_USED

SALES

17,173333333

FINANCE

8,14444444

Você pode exibir a atribuição de custo para todos os warehouses em um determinado mês com suas tags e valores de tag. Essa consulta também identifica warehouses sem tag:

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
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 |
+-------------+-------------+-----------------+

Para obter mais detalhes completos sobre o uso de tags de objetos, consulte Marcação de objetos.

Custo de atributos para consultas

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.

Atribuição de custos por tag, usuário e consulta

Você pode atribuir custos de warehouse e consulta por tag, usuário ou por consulta (por exemplo, consultas recorrentes).

Atribuição de custo de warehouse com base na tag de consulta

Você pode usar o parâmetro QUERY_TAG para alocar custos entre diferentes cargas de trabalho. Uma tag de consulta pode ser atribuída no nível da sessão para uma carga de trabalho ou um conjunto de consultas. Para obter mais informações sobre atribuição baseada em tags, consulte Fluxo de trabalho de atribuições.

Para definir uma tag de consulta para uma sessão, siga estas etapas:

  1. Crie uma tag. Por exemplo, crie uma tag para a equipe financeira:

    CREATE TAG finance;
    
    Copy
  2. Defina uma tag de consulta para a sessão atual:

    ALTER SESSION SET query_tag = finance;
    
    Copy

    A tag finance é associada a todas as consultas executadas durante a sessão.

  3. Para exibir o custo do warehouse de todas as consultas com tag para o mês atual, execute a seguinte instrução. Observe que essa consulta aloca todo o custo de computação do warehouse das tags (incluindo tempo ocioso) para reconciliação:

    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 >= DATE_TRUNC('MONTH', CURRENT_DATE)
         AND start_time < 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;
    
    Copy

Atribuição de custo de warehouse baseada no usuário

Você pode atributo o custo do warehouse por usuário. Por exemplo, para determinar o custo total do warehouse atribuído a cada usuário para o mês atual, execute a seguinte instrução:

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 |
|-----------+--------------------|
| JSMITH    |       17.173333333 |
|-----------+--------------------|
| MJONES    |         8.14444444 |
|-----------+--------------------|
| SYSTEM    |         5.33985393 |
+-----------+--------------------+

Custo de consulta para consultas recorrentes

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.

Custo de consulta para 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