Mesurer le coût d'une requête

Techniques pour mesurer et attribuer le coût de chaque requête sur BigQuery et Snowflake.

Pourquoi mesurer avant d'optimiser

Dans la majorité des plateformes data, les dérives de coûts ne proviennent pas de l'infrastructure, mais de décisions peu visibles : requêtes exécutées trop souvent, dashboards mal conçus, warehouses utilisés sans cadre clair.

Sans mesure fine, toute optimisation devient approximative. On coupe des coûts au hasard, on surcorrige certains usages, ou l'on dégrade la performance sans bénéfice réel.

Le FinOps Data commence toujours par la même étape : rendre chaque requête mesurable, attribuable et comparable.

À retenir

80 % des coûts proviennent généralement de 5 % des requêtes. Identifiez ce top 5 % avant toute optimisation.

Mesurer le coût d'une requête BigQuery

BigQuery facture les données scannées, et non les données retournées. Cette distinction est essentielle pour comprendre l'origine de nombreux écarts de facturation.

Coût = (Bytes scannés / 1 TB) x $5

-- Requête scannant 500 GB
SELECT customer_id, SUM(amount)
FROM `project.dataset.transactions`
WHERE date BETWEEN '2024-01-01' AND '2024-12-31'
GROUP BY customer_id;

-- Coût ≈ 0.5 TB x $5 = $2.50

Point clé

Une requête qui retourne peu de lignes peut coûter plus cher qu'un batch complet si elle scanne trop de données.

Identifier les requêtes BigQuery les plus coûteuses

La visibilité FinOps commence par l'identification des requêtes qui consomment réellement le budget. INFORMATION_SCHEMA constitue le point d'entrée principal.

SELECT
  user_email,
  query,
  total_bytes_billed,
  ROUND(total_bytes_billed / POW(1024, 4) * 5, 2) AS cost_usd,
  creation_time
FROM `region-us`.INFORMATION_SCHEMA.JOBS
WHERE job_type = 'QUERY'
  AND state = 'DONE'
ORDER BY total_bytes_billed DESC
LIMIT 20;

Cette vue permet de prioriser les actions : on n'optimise pas tout, on optimise ce qui a un impact réel sur la facture.

Erreur fréquente

Se concentrer uniquement sur les requêtes ad-hoc. Les jobs schedulés (dbt, Airflow) représentent souvent 70 % des coûts car ils tournent sans supervision humaine.

Mesurer le coût d'une requête Snowflake

Snowflake adopte une approche différente. Le coût dépend du temps d'exécution et de la taille du warehouse utilisé.

Coût = (Durée / 3600) x Crédits par heure x Prix par crédit

-- Requête de 30 secondes
-- Warehouse Medium (4 crédits/heure)
-- Edition Enterprise ($3/crédit)

Coût ≈ (30 / 3600) x 4 x 3 = $0.10

Identifier les requêtes Snowflake les plus coûteuses

Dans Snowflake, le coût dépend fortement du contexte : taille du warehouse, concurrence, stratégie d'auto-suspend.

SELECT
  user_name,
  warehouse_name,
  warehouse_size,
  execution_time / 1000 AS seconds,
  credits_used,
  ROUND(credits_used * 3, 2) AS cost_usd
FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
WHERE start_time > DATEADD(day, -1, CURRENT_TIMESTAMP())
ORDER BY credits_used DESC
LIMIT 20;

Bonnes pratiques FinOps Data

  • Mesurer avant d'optimiser : la donnée guide la décision
  • Attribuer les coûts : utilisateur, équipe, produit
  • Comparer dans le temps : avant et après optimisation
  • Automatiser la visibilité : dashboards et alertes
  • Relier coût et valeur : une requête chère n'est pas nécessairement inutile

Décision concrète

Créez un label ou un tag "cost_center" obligatoire pour chaque job. Sans attribution, impossible de responsabiliser les équipes.
Jonathan Kini

Jonathan Kini

J'aide les équipes data à réduire et maîtriser leurs coûts BigQuery et Snowflake, sans sacrifier la performance. 8 ans de terrain, de la startup aux environnements data à grande échelle.