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 s’appliquent à la création de tables dynamiques. Pour une liste complète, voir Limites des tables dynamiques.

Note

Pour obtenir des conseils sur l’écriture de requêtes qui fonctionnent efficacement avec l’actualisation incrémentielle, consultez Optimiser les requêtes pour l’actualisation incrémentielle.

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 mywh pour les ressources de calcul nécessaires pour l”actualisation.

  • Vous souhaitez que le mode d’actualisation soit automatiquement sélectionné.

  • 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;
Copy

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 avec immuabilité et remplissage rétroactif

Les contraintes d’immuabilité vous permettent de marquer des parties d’une table dynamique comme statiques. Lorsque vous définissez une clause IMMUTABLE WHERE, Snowflake ignore ces lignes lors de l’actualisation, ce qui améliore les performances pour les tables contenant de grandes quantités de données historiques.

Le remplissage rétroactif étend les contraintes d’immuabilité en vous permettant de copier des données existantes dans une table dynamique sans les calculer. Cette opération rend les données historiques immédiatement disponibles pendant que vous définissez une requête d’actualisation personnalisée pour les mises à jour futures.

Pour plus d’informations et d’exemples, voir Utiliser les contraintes d’immuabilité.

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.

Comparaison entre les graphiques de tâches et les DAGs de tables dynamiques

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 :

  1. Définissez la valeur de TARGET_LAG de toutes vos tables dynamiques sur DOWNSTREAM.

  2. Créez une table dynamique « contrôleur » qui lit toutes les feuilles de votre graphique de tâches.

    • Une table dynamique feuille est un nœud de votre graphique de tâches qui ne dépend pas de dépendances en aval. Aucune autre table dynamique ne lit les données à partir de celle-ci ; il ne s’agit donc pas d’une dépendance d’une autre table dynamique.

    • Remplacez <leaf1>, <leaf2>, …, <leafN> par des noms de tables dynamiques feuilles réels.

    • Pour vous assurer que ce contrôleur ne consomme pas de ressources, créez une jointure cartésienne avec LIMIT 0.

    CREATE DYNAMIC TABLE controller
      TARGET_LAG = <target_lag>
      WAREHOUSE = <warehouse>
      AS
        SELECT 1 A FROM <leaf1>, …, <leafN> LIMIT 0;
    
    Copy
  3. 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>;
    
    Copy
  • Actualisez manuellement le graphique de tâches.

    ALTER DYNAMIC TABLE controller REFRESH;
    
    Copy

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 :

  1. Connectez-vous à Snowsight.

  2. Dans le menu de navigation, sélectionnez Monitoring » Query History.

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

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