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 méthodes suivantes.
CREATE HYBRID TABLE. L’exemple suivant crée une table hybride avec une contrainte PRIMARY KEY, insère quelques lignes, supprime une ligne et interroge la table :
CREATE OR REPLACE HYBRID TABLE application_log ( id NUMBER PRIMARY KEY AUTOINCREMENT, col1 VARCHAR(20), col2 VARCHAR(20) NOT NULL ); INSERT INTO application_log (col1, col2) VALUES ('A1', 'B1'); INSERT INTO application_log (col1, col2) VALUES ('A2', 'B2'); INSERT INTO application_log (col1, col2) VALUES ('A3', 'B3'); INSERT INTO application_log (col1, col2) VALUES ('A4', 'B4'); SELECT * FROM application_log; UPDATE application_log SET col2 = 'B3-updated' WHERE id = 3; DELETE FROM application_log WHERE id = 4; SELECT * FROM application_log;
CREATE HYBRID TABLE. .. AS SELECT (CTAS) ou CREATE HYBRID TABLE … LIKE. Par exemple :
CREATE OR REPLACE HYBRID TABLE dept_employees ( employee_id INT PRIMARY KEY, department_id VARCHAR(200) ) AS SELECT employee_id, department_id FROM company_employees;
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 en masse présuppose que la table vient d’être créée et qu’aucun enregistrement n’y a été chargé, ou qu’elle a été créée à l’aide d’une requête CTAS.
Lorsqu’une table hybride est vide, les trois méthodes de chargement (CTAS, COPY et INSERT INTO. .. SELECT) utilisent le chargement en masse optimisé pour accélérer le processus de chargement. Une fois la table chargée, les performances normales de INSERT s’appliquent. Vous pouvez toujours exécuter des chargements de lots incrémentiels avec les opérations COPY et INSERT INTO. .. SELECT, mais ils seront généralement moins efficaces. La vitesse du chargement en masse atteint couramment environ 1 million d’enregistrements par minute, mais elle peut varier considérablement en fonction de la structure de la table (par exemple, les enregistrements de grande taille sont plus lents à charger). 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 la section Statistics des profils de requête de Snowsight pour savoir si le chemin rapide de chargement en masse a été utilisé. La valeur Number of rows inserted est libellée 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 :

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, ajoutez une contrainte unique et un index secondaire à la définition de la table :
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;
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.
Note
Vérifiez le statut de la construction de l’index à l’aide de la commande SHOW INDEXES. Une seule construction d’index à la fois est prise en charge.
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 NUMBER(38,0) 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)
);
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 créer des index secondaires supplémentaires sur des attributs de clé non primaire afin d’accélérer les recherches sur ces attributs. Les index peuvent permettre de réduire le nombre d’enregistrements analysés lorsqu’un prédicat de requête utilise l’une des conditions suivantes :
=
,>
,>=
,<
,<=
(opérateurs de comparaison)Conditions [ NOT ] IN
Conditions [ NOT ] BETWEEN
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. Tenez 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¶
La largeur des index est limitée. Lorsque vous créez des index sur les colonnes d’une table hybride, en particulier s’ils regroupent un grand nombre de colonnes, toute commande de chargement de la table (y compris CTAS, COPY ou INSERT INTO. .. SELECT) peut renvoyer l’erreur suivante. Dans cet exemple, la table contient un index nommé IDX_HT100_COLS
:
The value is too long for index "IDX_HT100_COLS".
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 des index sur un nombre réduit de colonnes.
Vous pouvez également essayer d’utiliser des colonnes INCLUDE sur les index secondaires lorsque vous créez la table. Pour un exemple simple, voir Créer un index secondaire avec une colonne INCLUDE. (Les colonnes INCLUDE sont prises en charge lors de la création de tables hybrides, mais pas lorsque vous créez des index à l’aide de la commande CREATE INDEX)