Créer une table hybride

Ce chapitre présente brièvement la création de tables hybrides dans Snowflake.

Note

Pour créer une table hybride, vous devez disposer d’un entrepôt en cours d’exécution spécifié comme l’entrepôt actuel de votre session. Des erreurs peuvent se produire si aucun entrepôt en cours d’exécution n’est spécifié lorsque vous créez une table hybride. Pour plus d’informations, voir Utilisation des entrepôts.

Options CREATE HYBRID TABLE

Vous pouvez créer une table hybride en utilisant l’une des commandes SQL suivantes :

  • CREATE HYBRID TABLE. Dans cet exemple, on crée une table hybride, on y insère des lignes, on supprime une ligne et on interroge la table :

    CREATE OR REPLACE HYBRID TABLE icecream (
      id NUMBER PRIMARY KEY AUTOINCREMENT START 1 INCREMENT 1,
      col1 VARCHAR NOT NULL,
      col2 VARCHAR NOT NULL
      );
    
    INSERT INTO icecream VALUES(1, 'A1', 'B1');
    INSERT INTO icecream VALUES(2, 'A2', 'B2');
    INSERT INTO icecream VALUES(3, 'A3', 'B3');
    INSERT INTO icecream VALUES(4, 'A4', 'B4');
    
    UPDATE icecream SET col2 = 'B3-updated' WHERE id = 3;
    
    DELETE FROM icecream WHERE id = 4;
    
    SELECT * FROM icecream;
    
    Copy
  • CREATE HYBRID TABLE. .. AS SELECT (CTAS) ou CREATE HYBRID TABLE … LIKE. Par exemple :

    CREATE OR REPLACE HYBRID TABLE table1 (
      employee_id INT PRIMARY KEY,
      department_id VARCHAR(200)
      )
    AS SELECT * FROM table2;
    
    Copy

Chargement des données

Note

Étant donné que le stockage principal des tables hybrides est un magasin de lignes, les tables hybrides ont généralement une empreinte de stockage plus grande que les tables standard. La principale raison de cette différence est que les données en colonnes des tables standard atteignent souvent des taux de compression plus élevés. Pour obtenir des informations sur les coûts de stockage, voir Évaluation du coût des tables hybrides.

Chargements en masse optimisés

Vous pouvez charger en masse des données dans des tables hybrides en les copiant à partir d’une zone de préparation de données ou d’autres tables (à l’aide de CTAS, COPY INTO <table> ou INSERT INTO. .. SELECT).

L’optimisation des chargements groupés dépend du fait que la table soit vide ou non. Dans ce contexte, une table n’est considérée comme vide que si aucune ligne n’y a jamais été chargée. Une table existante dont les lignes ont été supprimées n’est pas considérée comme vide. Une table qui vient d’être créée et qui n’a pas encore été chargée de quelque manière que ce soit, ou qui est en train d’être créée et chargée à la place avec CTAS, est vraiment vide.

Lorsqu’une table hybride est vide, les trois méthodes de chargement (CTAS, COPY, et INSERT INTO. .. SELECT) utilisent le chargement en masse optimisé, qui est un modèle d’exécution rapide pour l’insertion de données dans les tables hybrides.

Actuellement, lorsque les tables hybrides ne sont pas vides, le chargement en masse optimisé n’est pas utilisé. Chargements incrémentiels par lots avec COPY et INSERT INTO. .. Les opérations SELECT peuvent toujours être effectuées, mais elles seront généralement moins efficaces. Vous devriez constater des vitesses de chargement d’environ 1 million d’enregistrements par minute, mais notez que cette estimation dépend de la structure de la table (par exemple, les enregistrements de grande taille sont plus lents à charger). Si vos chargements, mises à jour et fusions prennent trop de temps et échouent, testez avec un ensemble de données plus petit ou divisez ces opérations en petits morceaux. Le chargement en masse optimisé sera étendu à la prise en charge des chargements par lots incrémentiels dans une prochaine version.

Vous pouvez vérifier les informations relatives à Statistics dans le profil de requête de l”Snowsight pour savoir si le chemin rapide de chargement en masse a été utilisé. Number of rows inserted est référencé comme Number of rows bulk loaded lorsque le chemin rapide est utilisé. Par exemple, cette opération CTAS a permis de charger en masse 200 000 lignes dans une nouvelle table :

Profil de requête CTAS qui utilise le chargement en masse optimisé

Un chargement par lots incrémentiel ultérieur dans la même table n’utiliserait pas le chargement en masse optimisé.

Pour de plus amples informations sur les profils de requête, voir Analyse des profils de requête pour les tables hybrides et Surveillance de l’activité des requêtes avec l’historique des requêtes.

Attention

Les commandes CTAS ne prennent pas en charge les contraintes de FOREIGN KEY. Si votre table hybride nécessite des contraintes de type FOREIGN KEY, utilisez COPY ou INSERT INTO. .. SELECT pour charger la table.

Note

Les autres méthodes de chargement de données dans des tables Snowflake (par exemple, Snowpipe) ne sont actuellement pas prises en charge.

Ajout d’index à une table hybride

Vous pouvez définir des clés, des index et des contraintes lorsque vous créez une table hybride. Par exemple :

CREATE OR REPLACE HYBRID TABLE target_hybrid_table (
    col1 VARCHAR(32) PRIMARY KEY,
    col2 NUMBER(38,0) UNIQUE,
    col3 NUMBER(38,0),
    INDEX index_col3 (col3)
    )
  AS SELECT col1, col2, col3 FROM source_table);
Copy

Vous pouvez éventuellement créer un index pour une table hybride existante via CREATE INDEX. Utilisez cette commande pour ajouter un index à une table hybride qui est activement utilisée pour une charge de travail et qui sert des requêtes, ou qui possède des clés étrangères. CREATE INDEX créera un index simultanément sans verrouiller la table pendant l’opération.

Cependant, si votre application de table hybride est en mode développement ou test, et que le temps d’arrêt de la table n’est pas un problème, il est plus efficace de recréer la table hybride et de créer les index en exécutant un chargement en masse optimisé, ce qui est plus efficace que la création d’index en ligne avec la commande CREATE INDEX.

Le chargement en masse optimisé est pris en charge pour CTAS, COPY, et INSERT INTO. .. SELECT mais vous ne pouvez pas utiliser CTAS si votre table a une contrainte FOREIGN KEY. La deuxième table créée dans cet exemple, fk_hybrid_table, devrait être chargée en masse avec COPY ou INSERT INTO. .. SELECT :

CREATE OR REPLACE HYBRID TABLE ref_hybrid_table (
    col1 VARCHAR(32) PRIMARY KEY,
    col2 INT UNIQUE);

CREATE OR REPLACE HYBRID TABLE fk_hybrid_table (
    col1 VARCHAR(32) PRIMARY KEY,
    col2 NUMBER(38,0),
    col3 NUMBER(38,0),
    FOREIGN KEY (col2) REFERENCES ref_hybrid_table(col2),
    INDEX index_col3 (col3)
);
Copy

Toutes les tables hybrides nécessitent une clé primaire unique. Les données d’une table hybride sont classées en fonction de cette clé primaire. Vous pouvez ajouter des index secondaires supplémentaires à des attributs de clé non primaire afin d’accélérer les recherches sur ces attributs. Pour réduire le nombre d’enregistrements à analyser, les index peuvent être exploités pour les prédicats =, >, >=, <, <=, et IN.

Attention

Pour ajouter un index secondaire, vous devez utiliser un rôle bénéficiant du privilège SELECT sur la table hybride. Si vous avez accès à une vue des données de la table hybride, mais pas à la table elle-même, vous ne pourrez pas ajouter d’index secondaire.

Si vous avez des requêtes courantes et répétées avec des prédicats sur un attribut spécifique ou un groupe d’attributs composite, vous pouvez envisager d’ajouter un index à cet attribut ou à ce groupe d’attributs pour améliorer les performances. Il convient toutefois de tenir compte des considérations suivantes lors de l’utilisation d’index :

  • Augmentation de la consommation de stockage lors du stockage de copies supplémentaires du sous-ensemble de données dans l’index.

  • Ajout de frais généraux aux DMLs, car les index sont gérés de manière synchrone.

Erreurs d’indexation lors des chargements

Lorsque des index sont construits sur les colonnes d’une table hybride, en particulier des index sur un grand nombre de colonnes, toute commande qui charge la table (y compris CTAS, COPY, ou INSERT INTO. .. SELECT) peut renvoyer l’erreur suivante :

The value is too long for index "IDX_HT100_COLS".

Dans cet exemple, IDX_HT100_COLS est le nom d’un index sur la table en cours de création.

Cette erreur se produit car le stockage basé sur les lignes impose une limite à la taille des données (et des métadonnées) pouvant être stockées par enregistrement. Pour réduire la taille de l’enregistrement, essayez de créer la table sans spécifier de grandes colonnes (comme des colonnes VARCHAR larges) comme colonnes indexées.

Vous pouvez également essayer de créer la table en utilisant des colonnes INCLUDE sur des index secondaires au lieu d’indexer directement les colonnes. Pour un exemple simple, voir Créer un index secondaire avec une colonne INCLUDE.