Dans les articles précédents, on a posé les bases :
- L’architecture de Snowflake (storage / compute / cloud services)
- Les types de tables
- Les types de vues
- Les stages
- Les file formats
La question d'après, c'est :
Comment savoir ce qui a changé dans une table, suivre ces changements et ne charger que le delta ( chargement incrémental ) ?
C'est exactement ce que les streams Snowflake viennent résoudre.
C'est quoi concrètement un stream dans Snowflake ?
Un stream est un objet Snowflake, pareil qu'une table ou une vue. Sa mission, c'est de répondre à une question simple : “qu'est-ce qui a changé dans cette table ou cette vue depuis la dernière fois que je l'ai consommé ?” ce qui permet de faire du delta, et de l'incremental load facilement.
Comme on l’a vu dans les articles d’avant, Snowflake garde l’historique des données avec le Time Travel et du change tracking. Un stream vient juste s’appuyer dessus et donc au moment où on le crée, il prend un point de départ, puis à chaque fois qu’on le lit, il ne renvoie que les lignes qui ont changé (ajout, modification, suppression) depuis la dernière fois.
Exemple de la création d'un stream
Rien ne vaut un exemple pour comprendre le concept, on commence par créer une table members.
CREATE OR REPLACE TABLE members (
id NUMBER,
name STRING,
age NUMBER
);
INSERT INTO members VALUES (1, 'Titi', 30);
INSERT INTO members VALUES (2, 'Bob', 25);
On crée un stream dessus :
CREATE OR REPLACE STREAM members_stream
ON TABLE members;
On fait quelques opérations :
UPDATE members SET age = 31 WHERE id = 1;
DELETE FROM members WHERE id = 2;
Si tu fais :
SELECT * FROM members;
tu peux voir l'état courant de la table.

Si tu fais :
SELECT * FROM members_stream;
tu peux voir les changements depuis la création du stream, plus quelques colonnes techniques qui expliquent ce qui s'est passé.

NB : dans un stream, un UPDATE est représenté comme un INSERT suivi d’un DELETE.
Les colonnes METADATA$…
Quand tu interroges un stream, Snowflake rajoute trois colonnes :
METADATA$ACTIONte dit si la ligne correspond à unINSERTou unDELETE.METADATA$ISUPDATEest à TRUE quand cette ligne fait partie d'unUPDATE(qui est représenté comme unDELETE+INSERT).METADATA$ROW_IDest un identifiant unique par ligne, utile si tu veux suivre la même ligne au fil du temps et voir toutes les modifications.
Les principaux types de streams
Snowflake propose trois types de streams. Le principe reste le même, ce qui change c'est ce qu'ils remontent.
Standard stream
C'est le type par défaut. Il suit tout les INSERT, UPDATE (représenté en DELETE + INSERT) et DELETE.
C'est parfait pour faire du CDC.
CREATE OR REPLACE STREAM members_stream
ON TABLE members;
Append-only stream
L'append-only stream ne renvoie que les nouvelles lignes (uniquement les inserts).
Les updates et deletes ne remontent pas.
C'est très bien pour des tables qui ne font que grossir (logs, events) ou quand tu n'as besoin que des nouvelles insertion.
CREATE OR REPLACE STREAM members_stream_append
ON TABLE members
APPEND_ONLY = TRUE;
Insert-only stream
Insert-only stream est surtout là pour les external tables (et les tables Iceberg externes).
L'idée est la même que pour l'append-only, c'est quand tu veux voir quelles nouvelles lignes sont arrivées dans ton data lake depuis la dernière fois.
CREATE OR REPLACE STREAM ext_orders_stream
ON EXTERNAL TABLE ext_orders
INSERT_ONLY = TRUE;
Comment consommer un stream dans un pipeline ?
Prenons un cas très simple, donc on a une table members où arrivent les nouvelles lignes, et on veut garder une autre table members_dim à jour avec ces données. L'idée donc est juste de répercuter les nouvelles lignes dans members_dim...
On va créer un stream append-only qui point sur la table members :
CREATE OR REPLACE STREAM members_stream_append
ON TABLE members
APPEND_ONLY = TRUE;
Et on va créer la nouvelle table cible members_dim :
CREATE OR REPLACE TABLE members_dim (
id NUMBER,
name STRING,
age NUMBER
);
Pour synchroniser members_dim avec uniquement les nouvelles lignes de la table members , on peut faire un MERGE très basique :
MERGE INTO members_dim d
USING members_stream_append s
ON d.id = s.id
WHEN MATCHED THEN
UPDATE SET
d.name = s.name,
d.age = s.age
WHEN NOT MATCHED THEN
INSERT (id, name, age)
VALUES (s.id, s.name, s.age);
Si ensuite on veut gérer aussi les deletes et les updates, là on passe par un standard stream et on s'appuie davantage sur les colonnes METADATA$ACTION et METADATA$ISUPDATE.
Comment choisir son type de stream ?
C'est très simple :
- Tu veux tout suivre (insert / update / delete) → standard stream.
- Tu veux suivre que les nouvelles lignes → append-only stream (ou insert-only si c’est une external table).
Cet article vient compléter la petite série sur Snowflake. Si on résume ce qu’on a vu jusqu’ici :
- Architure pour comprendre comment snowflake fonctionne
- les stages répondent à la question “où sont les fichiers ?”
- les file formats expliquent “comment les lire”
- les tables et les vues sont l’endroit où la donnée vit et est exposée
- les streams nous disent ce qui a changé entre deux exécutions.
Dans le prochain article, on va s'attaquer aux Tasks.

