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.
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:
Exibição TAG_REFERENCES: identifica objetos (por exemplo, warehouses e usuários) que têm tags.
Exibição WAREHOUSE_METERING_HISTORY: fornece uso de crédito para warehouses.
Exibição QUERY_ATTRIBUTION_HISTORY: fornece os custos de computação para consultas. O custo por consulta é o uso de crédito do warehouse para executar a consulta.
Para obter mais informações sobre como usar essa exibição, consulte Sobre a exibição QUERY_ATTRIBUTION_HISTORY.
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 compartilhados por usuários de diferentes departamentos
Recursos usados por aplicativos que precisam atribuir custos a diferentes departamentos
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';
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 das consultas (excluindo o tempo ocioso) por tag de consulta
Cálculo do custo das consultas (incluindo o tempo ocioso) por tag de consulta
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;
+---------------------+-----------------+------+
| 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;
+-------------------------+-----------------+------+
| 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;
+-------------------------+--------------------+
| 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.
Mude para uma função que tenha acesso ao esquema ACCOUNT_USAGE.
Navegue até Admin » Cost Management.
Selecione Consumption.
No menu suspenso Tags, selecione a tag
cost_center
.Para se concentrar em um centro de custo específico, selecione um valor da lista de valores da tag.
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;
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.
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;
Para obter mais informações, consulte Exemplo: consultas antigas com procedimentos armazenados.
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);