Introduction
Snowflake est un data warehouse cloud entièrement géré qui sépare le stockage du calcul, offrant une scalabilité horizontale infinie sans gestion d'infrastructure. En 2026, avec l'essor de l'IA et des pipelines de données en temps réel, Snowflake excelle grâce à ses fonctionnalités comme Snowpipe pour le streaming, Time Travel pour les audits et les clones zero-copy.
Ce tutoriel intermédiaire vous guide pour configurer un environnement complet : installation de SnowSQL, création de warehouses, bases de données, chargement de données via stages internes, requêtes analytiques avancées et optimisation des coûts. Que vous migriez depuis un data lake ou construisiez un data mart, ces étapes concrètes boosteront votre productivité. Imaginez scaler votre compute de X-Small à 6X-Large en une commande SQL, sans downtime. Prêt à exploiter 100 To de données en quelques minutes ? (128 mots)
Prérequis
- Un compte Snowflake actif (essai gratuit sur snowflake.com)
- Bases en SQL (JOIN, WINDOW functions)
- SnowSQL installé (optionnel mais recommandé)
- Fichiers CSV de test (ex: 1 Mo de ventes)
Installer SnowSQL
#!/bin/bash
# Téléchargement et installation SnowSQL (macOS/Linux)
wget https://repo1.maven.org/maven2/net/snowflake/snowsql/1.3.5/snowsql-1.3.5-linux_x86_64.tgz
tar -xzf snowsql-1.3.5-linux_x86_64.tgz
sudo mv snowsql/ /opt/snowsql/
# Configuration ~/.snowsql/config
cat > ~/.snowsql/config << EOF
[connections]
accountname = xy12345.us-east-1
username = VOTRE_USER
password = VOTRE_MDP
warehouse = COMPUTE_WH
rolename = SYSADMIN
EOF
# Test de connexion
/opt/snowsql/snowsql -a xy12345.us-east-1 -u VOTRE_USERCe script télécharge, installe SnowSQL et configure le fichier ~/.snowsql/config avec vos identifiants Snowflake. Remplacez les placeholders par vos valeurs réelles. SnowSQL est l'CLI officiel pour exécuter SQL en batch ou interactif, idéal pour l'automatisation CI/CD. Évitez les mots de passe en clair en production ; utilisez key-pair auth.
Se connecter et créer un warehouse
Une fois SnowSQL installé, connectez-vous à votre compte. Un warehouse est l'unité de calcul scalable (comme un cluster auto-redimensionnable). Commencez par un XS pour les tests, scalable jusqu'à 6XL.
Créer un warehouse virtuel
USE ROLE SYSADMIN;
-- Suspendre si existant
ALTER WAREHOUSE IF EXISTS MON_WH SUSPEND;
-- Créer warehouse XS (1 credit/heure)
CREATE WAREHOUSE MON_WH
WAREHOUSE_SIZE = 'XSMALL'
AUTO_SUSPEND = 300
AUTO_RESUME = TRUE
MIN_CLUSTER_COUNT = 1
MAX_CLUSTER_COUNT = 2
SCALING_POLICY = 'STANDARD';
-- Utiliser le warehouse
USE WAREHOUSE MON_WH;
-- Vérifier statut
SELECT * FROM TABLE(INFORMATION_SCHEMA.WAREHOUSE_LOAD_HISTORY(MON_WH));Ce script crée un warehouse 'MON_WH' de taille XS avec suspension auto après 5 min d'inactivité, évitant les coûts inutiles. AUTO_RESUME relance instantanément. Vérifiez la charge via WAREHOUSE_LOAD_HISTORY pour monitorer les credits consommés. Piège : oubliez pas de SUSPEND manuellement en dev pour économiser.
Structurer la base de données
Créez une database et un schema. Snowflake supporte les namespaces flexibles, avec Time Travel (jusqu'à 90 jours) pour les récupérations.
Créer DB, schema et table
USE ROLE SYSADMIN;
-- Créer database avec rétention 7 jours
CREATE DATABASE IF NOT EXISTS MA_DB
DATA_RETENTION_TIME_IN_DAYS = 7;
USE DATABASE MA_DB;
-- Créer schema
CREATE SCHEMA IF NOT EXISTS ANALYTICS;
USE SCHEMA ANALYTICS;
-- Table pour données ventes (clustering sur date_r)
CREATE TABLE ventes (
id INT AUTOINCREMENT,
produit VARCHAR(100),
date_v NUMERIC(8,0),
quantite INT,
montant DECIMAL(10,2)
)
CLUSTER BY (date_v);
-- Insérer données test
INSERT INTO ventes (produit, date_v, quantite, montant) VALUES
('Laptop', 20260115, 1, 1200.00),
('Souris', 20260115, 10, 25.00);Crée une DB 'MA_DB' avec rétention pour Time Travel, un schema 'ANALYTICS' et une table clusterée sur date_v pour optimiser les scans (pruning automatique). CLUSTER BY accélère les queries temporelles. Les inserts test valident la structure. Attention : AUTOINCREMENT nécessite Snowflake Enterprise pour les features avancées.
Charger des données via stage interne
-- Créer stage interne
CREATE STAGE mon_stage
DIRECTORY = ( ENABLE = TRUE )
ENCRYPTION = ( TYPE = 'SNOWFLAKE_SSE' );
-- Uploader fichier local (via SnowSQL ou WS)
PUT file:///chemin/vers/ventes.csv @mon_stage AUTO_COMPRESS=TRUE;
-- Copier dans table (format CSV par défaut)
COPY INTO ventes
FROM @mon_stage/ventes.csv.gz
FILE_FORMAT = (TYPE = CSV FIELD_OPTIONALLY_ENCLOSED_BY = '"' SKIP_HEADER = 1)
ON_ERROR = 'CONTINUE';
-- Vérifier
SELECT COUNT(*) FROM ventes;Crée un stage interne sécurisé pour uploader des CSV compressés via PUT. COPY INTO parse et charge en bulk avec gestion d'erreurs. SKIP_HEADER ignore l'en-tête. Pour 1 To+, utilisez stages externes S3/GCS. Piège : vérifiez le FILE_FORMAT pour matcher votre CSV, sinon des NULLs inattendus.
Requêtes analytiques avancées
Exploitez les puissances analytiques : fenêtres, JSON, semi-structured data.
Query avec WINDOW et JSON
-- Ventes par jour avec running total
SELECT
date_v,
SUM(montant) as total_jour,
SUM(SUM(montant)) OVER (ORDER BY date_v ROWS UNBOUNDED PRECEDING) as running_total
FROM ventes
GROUP BY date_v;
-- Support JSON variant
CREATE TABLE events (
data VARIANT
);
INSERT INTO events SELECT PARSE_JSON('{"user_id":1, "action":"click"}');
SELECT data:user_id::INT as user_id, data:action
FROM events
WHERE data:action = 'click';Query WINDOW calcule un running total pour tendances. VARIANT gère JSON nativement sans schéma fixe, idéal pour logs IoT. ::INT caste pour analytics. Scalable à des milliards de rows grâce au MPP de Snowflake. Évitez les UDF coûteuses ; préférez SQL natif.
Time Travel et clonage
-- Récupérer table à -1h (si rétention >0)
CREATE TABLE ventes_backup AS
SELECT * FROM ventes AT (OFFSET => -3600);
-- Clôner zero-copy (instantané, sans duplication storage)
CREATE TABLE ventes_prod CLONE ventes;
-- Mettre à jour clone (indépendant)
UPDATE ventes_prod SET montant = montant * 1.1 WHERE id = 1;
-- Vérifier métadonnées
SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'ventes_prod';Time Travel récupère l'historique via OFFSET (secondes). CLONE crée une vue metadata-only, parfait pour dev/prod sans coûts storage. Mises à jour sont indépendantes. Limite : rétention par défaut 1 jour ; augmentez-la pour compliance.
Configurer Snowpipe pour streaming
-- Stage externe S3 (exemple AWS)
CREATE STAGE my_s3_stage
URL = 's3://mon-bucket/'
CREDENTIALS = (AWS_KEY_ID='xxx' AWS_SECRET_KEY='yyy');
-- Pipe auto-ingest
CREATE PIPE ventes_pipe
AUTO_INGEST = TRUE
AS
COPY INTO ventes
FROM @my_s3_stage
FILE_FORMAT = (TYPE = 'CSV' FIELD_DELIMITER = ',' SKIP_HEADER=1);
-- Notification S3 (Lambda ou NSQ)
-- Config via AWS SNS : arn:aws:sns:...
-- Vérifier pipes
SELECT * FROM TABLE(INFORMATION_SCHEMA.PIPE_STATUS('VENTES_PIPE'));
SHOW PIPES;Snowpipe ingère en near-real-time via notifications cloud (S3 Event). AUTO_INGEST active le polling auto. Coût : par fichier lu. Pour Kafka/Stream, utilisez Kafka connector. Piège : testez les credentials ; erreurs silencieuses si mal config.
Bonnes pratiques
- Scale warehouses par query : Utilisez RESOURCE_MONITOR pour caps budgets.
- Cluster keys multi-colonnes : Sur top 20% predicates pour 90% pruning.
- Stages + COPY : Toujours compressé (GZ 4x gain), partitionnez S3 par date.
- Zero-copy clones : Pour QA/prod, évite duplication (économies 50%+).
- Monitorer credits : QUERY_HISTORY + ACCOUNT_USAGE pour alerts Slack.
Erreurs courantes à éviter
- Warehouse non suspendu : Draine credits ; script CRON pour SUSPEND.
- Pas de clustering : Scans full-table sur >1B rows → timeouts.
- Oubli FILE_FORMAT : Données mal parsées (dates as STRING).
- Time Travel expiré : Définir DATA_RETENTION_TIME=90 dès création.
Pour aller plus loin
- Docs officielles : Snowflake Docs
- Intégrez avec dbt : dbt + Snowflake
- Formations avancées : Découvrez nos formations Learni sur Data Engineering pour Snowflake + Iceberg.