Avanzado 2 min de lectura

Atribución de Costos por Query

Técnicas avanzadas para atribuir el costo exacto a cada query, usuario, aplicación o proyecto usando Query Tags y QUERY_HISTORY.

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.

#finops #query-attribution #query-tag #chargeback