Créer des tables dynamiques¶
Ce sujet présente les concepts clés de la création de tables dynamiques.
Avant de commencer, assurez-vous de disposer des privilèges permettant de créer des tables dynamiques et vérifiez que tous les objets utilisés par la requête de table dynamique ont le suivi des modifications activé.
Certaines limitations peuvent s’appliquer à la création de tables dynamiques. Pour une liste complète, voir Limites des tables dynamiques.
Activer le suivi des modifications¶
Lors de la création d’une table dynamique avec un mode d’actualisation incrémentielle, si le suivi des modifications n’est pas déjà activé sur les tables interrogées, Snowflake tente automatiquement d’activer le suivi des modifications sur ces tables. Afin que les actualisations incrémentielles puissent être prises en charge, il faut que le suivi des modifications soit activé avec une rétention Time Travel différente de zéro sur tous les objets sous-jacents utilisés par une table dynamique.
La table dynamique évolue en même temps que les objets de base. Si vous recréez un objet de base, vous devez réactiver le suivi des modifications.
Note
Snowflake ne tente pas automatiquement d’activer le suivi des modifications sur les tables dynamiques créées avec le mode d’actualisation complète.
Pour activer le suivi des modifications sur un objet de base de données spécifique, utilisez les commandes ALTER TABLE, ALTER VIEW, et autres commandes similaires sur cet objet. L’utilisateur qui crée la table dynamique doit disposer du privilège OWNERSHIP pour pouvoir activer le suivi des modifications sur tous les objets sous-jacents.
Pour vérifier si le suivi des modifications est activé, utilisez les commandes SHOW VIEWS, SHOW TABLES et autres commandes similaires sur les objets sous-jacents et inspectez la colonne change_tracking.
Objets de base pris en charge¶
Les tables dynamiques prennent en charge les objets de base suivants :
Tables
Tables Apache Iceberg™ gérées par Snowflake
Tables Apache Iceberg™ gérées en externe
Exemple : Créer une table dynamique simple¶
Supposons que vous souhaitiez créer une table dynamique contenant l”product_id et les colonnes product_name de la table nommée staging_table, et que vous décidiez des points suivants :
Vous souhaitez que les données de votre table dynamiques aient au maximum 20 minutes de retard sur les données de
staging_table.Vous souhaitez utiliser l’entrepôt
mywhpour les ressources de calcul nécessaires pour l”actualisation.Vous souhaitez que le mode d’actualisation soit automatiquement sélectionné.
Snowflake recommande d’utiliser le mode d’actualisation automatique uniquement pendant le développement. Pour plus d’informations, voir Bonnes pratiques pour le choix des modes d’actualisation des tables dynamiques.
Vous souhaitez que la table dynamique soit actualisée de manière synchrone lors de sa création.
Vous souhaitez que le mode d’actualisation soit sélectionné automatiquement et que la table dynamique soit actualisée de manière synchrone lors de sa création.
Pour créer cette table dynamique, exécutez l’instruction SQL CREATE DYNAMIC TABLE suivante :
CREATE OR REPLACE DYNAMIC TABLE my_dynamic_table
TARGET_LAG = '20 minutes'
WAREHOUSE = mywh
REFRESH_MODE = auto
INITIALIZE = on_create
AS
SELECT product_id, product_name FROM staging_table;
Pour une liste complète des paramètres et de la syntaxe des variantes, voir la référence CREATE DYNAMIC TABLE.
Créer des tables dynamiques qui lisent depuis des tables Apache Iceberg™ gérées par Snowflake ou gérées en externe¶
Créer une table dynamique à partir d’une table Iceberg est similaire à la création d’une table dynamique à partir d’une table standard. Exécutez l’instruction CREATE DYNAMIC TABLE SQL comme vous le feriez pour une table standard, en utilisant comme objet de base une table gérée par Snowflake ou une table gérée par un catalogue externe.
Les tables dynamiques qui lisent depuis une table Iceberg gérée par Snowflake en tant que table de base sont utiles si vous souhaitez que vos pipelines fonctionnent sur des données dans une table Iceberg gérée par Snowflake ou si vous souhaitez que vos pipelines s’exécutent sur des tables Iceberg écrites par d’autres moteurs. Notez que les moteurs externes ne peuvent pas écrire dans les tables Iceberg gérées par Snowflake. Elles sont en lecture-écriture pour Snowflake et en lecture seule pour les moteurs externes.
Tables dynamiques qui lisent à partir de tables Iceberg gérées par des catalogues externes (non Snowflake), par exemple AWS Glue et écrites par des moteurs comme Apache Spark, sont utiles pour traiter les données de data lakes externes. Vous pouvez créer des tables dynamiques au-dessus de données gérées en externe, en les traitant en continu dans Snowflake sans dupliquer ou ingérer les données.
Limites et considérations relatives à l’utilisation de tables Iceberg¶
Toutes les limites de tables dynamiques classiques et tables Iceberg dynamiques s’appliquent toujours.
En outre :
Toutes les limites des tables de base Iceberg s’appliquent. Pour plus d’informations, voir Considérations et limites.
Vous pouvez créer une table dynamique qui lit à partir de tables natives Snowflake, de tables Iceberg gérées par Snowflake et de tables Iceberg gérées en externe.
Les tables dynamiques suivent les modifications au niveau du fichier pour les tables de base Iceberg gérées en externe, contrairement aux autres tables de base qui suivent les modifications au niveau des lignes. Les opérations fréquentes de copie sur écriture (par exemple, les mises à jour ou les suppressions) sur les tables Iceberg gérées en externe peuvent avoir un impact sur les performances des actualisations incrémentielles.
Créer des tables dynamiques à l’aide du remplissage¶
Le remplissage est une opération à faible coût et à zéro copie qui rend les données sources immédiatement disponibles dans une table dynamique. Vous pouvez créer une table dynamique avec des données initiales remplies à partir d’une table ou d’une table dynamique, tout en définissant une requête d’actualisation personnalisée pour les mises à jour ultérieures.
Avec des limites d’immuabilité, seule la région immuable est remplie et reste inchangée, même si la région immuable ne correspond plus à la source. La région mutable est calculée à partir de la définition de la table dynamique et des tables de base, comme d’habitude.
Only data defined by the IMMUTABLE WHERE immutability constraint can be backfilled because the backfill data must remain unchanged, even if it differs from the upstream source.
Exemples d’utilisation du remplissage¶
Les exemples suivants montrent comment créer de nouvelles tables dynamiques à partir de tables avec des données remplies.
Chaque nom de colonne doit se trouver dans la table de remplissage avec les types de données compatibles et doit apparaître dans le même ordre que dans la table de remplissage. Les propriétés de la table et les privilèges de la table de remplissage ne sont pas copiés.
Si les paramètres de Time Travel AT | BEFORE sont spécifiés, les données de la table de remplissage sont copiées à l’heure spécifiée.
Exemple : Remplissage à partir d’une partie de la table¶
L’exemple suivant remplit la région immuable de my_dynamic_table à partir de my_backfill_table et de la région mutable de la définition de la table dynamique.
Dans ce scénario, si la table dynamique est créée avec un mode d’actualisation incrémentiel, la réinitialisation supprime toutes les lignes qui sont mutables et ne remplit que la région mutable. Si la table dynamique est créée avec le mode d’actualisation complet, une actualisation complète est déclenchée avec le même effet.
CREATE DYNAMIC TABLE my_dynamic_table (day TIMESTAMP, totalSales NUMBER)
IMMUTABLE WHERE (day < '2025-01-01')
BACKFILL FROM my_backfill_table
TARGET_LAG = '20 minutes'
WAREHOUSE = 'mywh'
AS SELECT DATE_TRUNC('day', ts) AS day, sum(price)
FROM my_base_table
GROUP BY day;
Exemple : Récupérer ou modifier des données dans une table dynamique via le remplissage¶
Vous ne pouvez pas modifier directement les données ou la définition d’une table dynamique. Pour récupérer ou corriger des données, procédez comme suit :
Cloner la table dynamique ver une table standard.
Modifiez la table clonée selon vos besoins.
Effectuez le remplissage depuis la table modifiée vers une nouvelle table dynamique.
Dans l’exemple suivant, my_dynamic_table agrège les données de ventes quotidiennes de la tables de base sales :
CREATE OR REPLACE TABLE sales(item_id INT, ts TIMESTAMP, sales_price FLOAT);
INSERT INTO sales VALUES (1, '2025-05-01 01:00:00', 10.0), (1, '2025-05-01 02:00:00', 15.0), (1, '2025-05-01 03:00:00', 11.0);
INSERT INTO sales VALUES (1, '2025-05-02 00:00:00', 11.0), (1, '2025-05-02 05:00:00', 13.0);
CREATE DYNAMIC TABLE my_dynamic_table
TARGET_LAG = 'DOWNSTREAM'
WAREHOUSE = mywh
INITIALIZE = on_create
IMMUTABLE WHERE (day <= '2025-05-01')
AS
SELECT item_id, date_trunc('DAY', ts) day, count(sales_price) AS sales_count FROM sales
GROUP BY item_id, day;
SELECT item_id, to_char(day, 'YYYY-MM-DD') AS day, sales_count FROM my_dynamic_table;
+---------+------------+-------------+
| ITEM_ID | DAY | SALES_COUNT |
|---------+------------+-------------|
| 1 | 2025-05-01 | 3 |
| 1 | 2025-05-02 | 2 |
+---------+------------+-------------+
Vous pouvez également archiver les anciennes données pour réduire les coûts de stockage :
DELETE FROM sales WHERE ts < '2025-05-02';
ALTER DYNAMIC TABLE my_dynamic_table REFRESH;
SELECT item_id, to_char(day, 'YYYY-MM-DD') AS day, sales_count FROM my_dynamic_table;
Plus tard, vous trouvez une erreur de vente sur 2025-05-01, où sales_count devrait être 2. Pour corriger cela :
Clonez
my_dynamic_tablevers une table ordinaire :CREATE OR REPLACE TABLE my_dt_clone_table CLONE my_dynamic_table;
Mettez à jour la table clonée :
UPDATE my_dt_clone_table SET sales_count = 2 WHERE day = '2025-05-01'; SELECT item_id, to_char(day, 'YYYY-MM-DD') AS day, sales_count FROM my_dt_clone_table;
+---------+------------+-------------+ | ITEM_ID | DAY | SALES_COUNT | |---------+------------+-------------| | 1 | 2025-05-01 | 2 | | 1 | 2025-05-02 | 2 | +---------+------------+-------------+
Recréez la table dynamique en utilisant le clone modifié comme source de remplissage.
CREATE OR REPLACE DYNAMIC TABLE my_dynamic_table BACKFILL FROM my_dt_clone_table IMMUTABLE WHERE (day <= '2025-05-01') TARGET_LAG = 'DOWNSTREAM' WAREHOUSE = mywh INITIALIZE = on_create AS SELECT item_id, date_trunc('DAY', ts) day, count(sales_price) AS sales_count FROM sales GROUP BY item_id, day;
Cette approche vous permet de récupérer ou de corriger les données d’une table dynamique sans modifier la table de base :
SELECT item_id, to_char(day, 'YYYY-MM-DD') AS day, sales_count FROM my_dynamic_table;
+---------+------------+-------------+ | ITEM_ID | DAY | SALES_COUNT | |---------+------------+-------------| | 1 | 2025-05-01 | 2 | | 1 | 2025-05-02 | 2 | +---------+------------+-------------+
Exemple : Modifier le schéma d’une table dynamique à l’aide du remplissage¶
Vous ne pouvez pas modifier directement le schéma d’une table dynamique. Pour mettre à jour le schéma, par exemple, ajouter une colonne, procédez comme suit :
Cloner la table dynamique ver une table standard. L’exemple suivant utilise
my_dynamic_tablecréée à partir desales(ci-dessus).CREATE OR REPLACE TABLE my_dt_clone_table CLONE my_dynamic_table;
Modifiez le schéma de la table clonée :
ALTER TABLE my_dt_clone_table ADD COLUMN sales_avg FLOAT; SELECT item_id, to_char(day, 'YYYY-MM-DD') as DAY, SALES_COUNT, SALES_AVG FROM my_dt_clone_table;
Si vous le souhaitez, renseignez les données dans la nouvelle colonne.
Recréez la table dynamique en utilisant le clone modifié comme source de remplissage.
CREATE OR REPLACE DYNAMIC TABLE my_dynamic_table BACKFILL FROM my_dt_clone_table IMMUTABLE WHERE (day <= '2025-05-01') TARGET_LAG = 'DOWNSTREAM' WAREHOUSE = mywh INITIALIZE = on_create AS SELECT item_id, date_trunc('DAY', ts) day, count(sales_price) AS sales_count, avg(sales_price) as sales_avg FROM sales GROUP BY item_id, day;
Cette approche vous permet de récupérer ou de corriger les données d’une table dynamique sans modifier la table de base :
SELECT item_id, to_char(day, 'YYYY-MM-DD') as DAY, SALES_COUNT, SALES_AVG, metadata$is_immutable as IMMUTABLE from my_dynamic_table ORDER BY ITEM_ID, DAY;
+---------+------------+-------------+-----------+-----------+ | ITEM_ID | DAY | SALES_COUNT | SALES_AVG | IMMUTABLE | |---------+------------+-------------|-----------|-----------| | 1 | 2025-05-01 | 3 | NULL | TRUE | | 1 | 2025-05-02 | 2 | 12 | FALSE | +---------+-------------+------------+-----------+-----------+
Limites et considérations lorsque vous créez une table dynamique avec des données rétroactives¶
Toutes les limites des tables dynamiques classiques et les limites des contraintes d’immuabilité s’appliquent toujours.
Les limites et considérations supplémentaires suivantes s’appliquent :
Actuellement, seules les tables standards et dynamiques peuvent être utilisées pour le remplissage.
Vous ne pouvez pas spécifier de politiques ni de balises dans la nouvelle table dynamique, car elles sont copiées à partir de la table de remplissage.
Les clés de clustering de la nouvelle table dynamique et de la table de remplissage doivent être identiques.
Bonnes pratiques pour la création de tables dynamiques¶
Lier des pipelines de tables dynamiques¶
Lorsque vous définissez une nouvelle table dynamique, plutôt que de définir une grande table dynamique avec de nombreuses instructions imbriquées, utilisez plutôt de petites tables dynamiques avec des pipelines.
Vous pouvez configurer une table dynamique pour interroger d’autres tables dynamiques. Par exemple, imaginez un scénario dans lequel votre pipeline de données extrait des données d’une table de mise en zone de préparation pour mettre à jour diverses tables de dimensions (par exemple, customer, product, date et time). En outre, votre pipeline met à jour une table des sales agrégées sur la base des informations provenant de ces tables de dimensions. En configurant les tables de dimensions pour qu’elles interrogent la table de mise en zone de préparation et la table des sales agrégées pour qu’elle interroge les tables de dimensions, vous créez un effet de cascade similaire à un graphique de tâches.
Dans cette configuration, l’actualisation de la table des sales agrégées n’est exécutée qu’une fois que les actualisations des tables de dimension ont été effectuées avec succès. Cela permet de garantir la cohérence des données et d’atteindre les objectifs en matière de délais. Grâce à un processus d’actualisation automatisé, toute modification apportée aux tables sources déclenche des actualisations dans toutes les tables dépendantes au moment opportun.
Utilisez une table dynamique « contrôleur » pour les graphiques de tâches complexes¶
Lorsque vous avez un graphique complexe de tables dynamiques avec de nombreuses racines et feuilles et que vous souhaitez effectuer des opérations liées aux performances (par exemple, changement de décalage, actualisation manuelle, suspension) sur le graphique de tâches complet avec une seule commande, procédez comme suit :
Définissez la valeur de
TARGET_LAGde toutes vos tables dynamiques surDOWNSTREAM.Créez une table dynamique « contrôleur » qui lit toutes les feuilles de votre graphique de tâches. Pour vous assurer que ce contrôleur ne consomme pas de ressources, procédez comme suit :
CREATE DYNAMIC TABLE controller TARGET_LAG = <target_lag> WAREHOUSE = <warehouse> AS SELECT 1 A FROM <leaf1>, …, <leafN> LIMIT 0;
Utilisez le contrôleur pour contrôler l’ensemble du graphique. Par exemple :
Définissez une nouvelle latence cible pour le graphique de tâches.
ALTER DYNAMIC TABLE controller SET TARGET_LAG = <new_target_lag>;Actualisez manuellement le graphique de tâches.
ALTER DYNAMIC TABLE controller REFRESH;
Utiliser des tables dynamiques transitoires pour réduire les coûts de stockage¶
Les tables dynamiques transitoires conservent les données de manière fiable dans le temps et prennent en charge Time Travel dans la période de conservation des données, mais ne conservent pas les données au-delà de la période Fail-safe. Par défaut, les données des tables dynamiques sont conservées pendant sept jours dans le stockage Fail-safe.
Pour les tables dynamiques avec un taux d’actualisation élevé, cela peut augmenter considérablement la consommation de stockage. Par conséquent, vous ne devez rendre une table dynamique transitoire que si ses données ne nécessitent pas le même niveau de protection et de récupération des données que les tables permanentes.
Vous pouvez créer une table dynamique transitoire ou cloner des tables dynamiques existantes en tables dynamiques transitoires à l’aide de l’instruction CREATE DYNAMIC TABLE.
Dépannage de la création de tables dynamiques¶
Lorsque vous créez une table dynamique, l’actualisation initiale se produit soit selon une planification (ON_SCHEDULE) ou immédiatement lors de la création (ON_CREATE). Le renseignement initial des données, ou initialisation<label-dynamic_tables_initialization>, dépend du moment où cette actualisation initiale a lieu. Par exemple, pour :code:`ON_CREATE, l’initialisation peut prendre plus de temps si elle déclenche l’actualisation des tables dynamiques en amont.
L’initialisation peut prendre un certain temps, suivant la quantité de données analysées. Pour voir la progression, procédez comme suit :
Connectez-vous à Snowsight.
Dans le menu de navigation, sélectionnez Monitoring » Query History.
Dans le menu déroulant Filters, entrez CREATE DYNAMIC TABLE dans le filtre SQL Text et entrez le nom de votre entrepôt dans le filtre Warehouse.
Sélectionnez la requête avec votre table dynamique sous SQL text et utilisez les onglets Query Details et Query Profile pour suivre la progression.