El problema de la atribución
Múltiples usuarios y equipos comparten warehouses en Snowflake. La pregunta de FinOps es: ¿quién generó qué costo?
Snowflake no tiene una métrica directa de “créditos por query” porque los warehouses se comparten, pero hay varias técnicas para aproximarlo.
Técnica 1: Query Tags
Los Query Tags permiten etiquetar queries con metadata personalizada, que luego aparece en QUERY_HISTORY.
-- Etiquetar una sesión completa (por aplicación o equipo)
ALTER SESSION SET QUERY_TAG = '{"team": "marketing", "project": "campaign_analysis", "env": "prod"}';
-- Ahora todas las queries de esta sesión llevan el tag
SELECT * FROM ventas WHERE fecha >= '2026-01-01';
Consultar costos por Query Tag
-- Costo por equipo usando query tags
SELECT
TRY_PARSE_JSON(query_tag):team::STRING AS equipo,
TRY_PARSE_JSON(query_tag):project::STRING AS proyecto,
COUNT(*) AS num_queries,
ROUND(SUM(credits_used_cloud_services), 4) AS creditos_cloud_svc,
SUM(execution_time) / 1000 AS total_segundos
FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
WHERE start_time >= DATEADD('month', -1, CURRENT_TIMESTAMP())
AND query_tag != ''
GROUP BY 1, 2
ORDER BY creditos_cloud_svc DESC;
Técnica 2: Warehouses por equipo
La forma más simple de hacer chargeback: un warehouse por equipo o proyecto.
-- Warehouse dedicado para el equipo de Data Science
CREATE WAREHOUSE ds_team_wh
WAREHOUSE_SIZE = 'MEDIUM'
AUTO_SUSPEND = 120
AUTO_RESUME = TRUE
COMMENT = 'Warehouse exclusivo equipo Data Science';
-- Dar acceso solo a ese equipo
GRANT USAGE ON WAREHOUSE ds_team_wh TO ROLE data_scientist_role;
Luego el costo de ds_team_wh en WAREHOUSE_METERING_HISTORY es 100% atribuible a ese equipo.
Técnica 3: Estimación de costo por query
-- Estimar costo proporcional por query
-- Calcula qué fracción del tiempo del warehouse usó cada query
WITH warehouse_cost AS (
SELECT
wmh.warehouse_name,
DATE_TRUNC('hour', wmh.start_time) AS hora,
wmh.credits_used
FROM SNOWFLAKE.ACCOUNT_USAGE.WAREHOUSE_METERING_HISTORY wmh
),
query_time AS (
SELECT
qh.query_id,
qh.user_name,
qh.warehouse_name,
DATE_TRUNC('hour', qh.start_time) AS hora,
qh.execution_time,
SUM(qh.execution_time) OVER (
PARTITION BY qh.warehouse_name, DATE_TRUNC('hour', qh.start_time)
) AS total_time_warehouse_hora
FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY qh
WHERE qh.start_time >= DATEADD('day', -7, CURRENT_TIMESTAMP())
)
SELECT
qt.query_id,
qt.user_name,
qt.warehouse_name,
ROUND(
wc.credits_used * (qt.execution_time / NULLIF(qt.total_time_warehouse_hora, 0)),
6
) AS creditos_estimados
FROM query_time qt
JOIN warehouse_cost wc
ON qt.warehouse_name = wc.warehouse_name
AND qt.hora = wc.hora
ORDER BY creditos_estimados DESC
LIMIT 50;
Chargeback con Budgets (Enterprise)
En edición Enterprise, puedes usar Budgets en Snowsight (Admin > Cost Management) para asignar límites monetarios por objeto, rol o etiqueta, y hacer chargeback formal por departamento.
Próximos pasos
La última lección de esta categoría cubre estrategias para reducir costos activamente.