Optimisation des Requêtes

Clustering keys, Query Profile et analyse des requêtes coûteuses.

Clustering Keys

Décision concrète

Ajoutez des clustering keys uniquement sur les tables de plus de 1 TB qui sont requêtées fréquemment avec des filtres sur les mêmes colonnes.

Le clustering améliore le pruning et réduit les données scannées.

-- Définir des clustering keys
CREATE TABLE events (
  event_id STRING,
  event_date DATE,
  country STRING,
  event_type STRING
)
CLUSTER BY (event_date, country);

-- Vérifier le clustering
SELECT SYSTEM$CLUSTERING_INFORMATION('events');

Attention

Attention : Le re-clustering automatique consomme des crédits. À utiliser sur les tables fréquemment requêtées.

Erreur fréquente

Mettre des clustering keys sur toutes les tables "au cas où" = facture de re-clustering qui peut dépasser les économies. Mesurez avant d'activer.

Query Profile

Utilisez le Query Profile dans la console pour identifier les bottlenecks :

  • Spillage to disk : Warehouse trop petit
  • Exploding joins : Jointures mal optimisées
  • Pruning faible : Ajoutez des clustering keys

À retenir

"Spillage to disk" dans le Query Profile = votre warehouse est trop petit pour cette requête. Augmentez la taille ou optimisez la requête.

Analyse des requêtes coûteuses

-- Top 20 requêtes les plus longues
SELECT
  query_id,
  user_name,
  warehouse_name,
  warehouse_size,
  execution_time / 1000 as seconds,
  ROUND(
    CASE warehouse_size
      WHEN 'X-Small' THEN 1
      WHEN 'Small' THEN 2
      WHEN 'Medium' THEN 4
      WHEN 'Large' THEN 8
    END * (execution_time / 1000 / 3600) * 3, 4
  ) AS cost_usd,
  LEFT(query_text, 100) as query_preview
FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
WHERE start_time > DATEADD(day, -7, CURRENT_TIMESTAMP())
  AND execution_status = 'SUCCESS'
ORDER BY execution_time DESC
LIMIT 20;
-- Coûts par utilisateur
SELECT
  user_name,
  COUNT(*) as query_count,
  ROUND(SUM(execution_time) / 1000 / 60, 2) as total_minutes,
  ROUND(SUM(credits_used_cloud_services), 2) as cloud_credits
FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
WHERE start_time > DATEADD(day, -30, CURRENT_TIMESTAMP())
GROUP BY user_name
ORDER BY total_minutes DESC
LIMIT 20;

Décision concrète

Exécutez ces requêtes chaque semaine. Identifiez le top 5 des utilisateurs/requêtes les plus coûteux et travaillez avec eux pour optimiser.
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.