SNOWFLAKE
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.