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;
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;
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.
Vous pouvez charger des données en masse dans des tables hybrides en les copiant à partir d’une zone de préparation de données ou d’autres tables (c’est-à-dire en utilisant CTAS, COPY ou INSERT INTO … SELECT), mais il est vivement conseillé de charger des données en masse dans une table hybride via une instruction CTAS. Le chargement en masse avec l’option CTAS est optimisé en termes de performances et permet des chargements importants (plusieurs millions d’enregistrements) environ 10 fois plus rapides que les autres options, dans la plupart des cas.
Le chargement en masse via INSERT ou COPY est également pris en charge, mais le chargement de données est plus lent pour les grandes quantités de données. Vous risquez d’être confronté(e) à de longs temps d’attente, voire à des dépassements de délai, lors du chargement d’ensembles de données volumineux. Les requêtes sur les données récemment chargées sont également plus lentes. L’optimisation du chargement en masse pour les instructions DML telles que COPY est prévue dans un avenir proche.
Attention
Les commandes CTAS ne prennent pas en charge les contraintes de clé étrangère. Si vous devez utiliser des contraintes de clé étrangère dans votre table hybride, utilisez une autre option de chargement telle que COPY ou INSERT INTO … SELECT.
Si vos données sources existent dans une zone de préparation externe au lieu d’une table Snowflake, utilisez la syntaxe suivante :
CREATE TABLE ... AS SELECT * FROM @stage/data.csv
Évitez d’utiliser cette syntaxe :
COPY FROM @stage/data.csv
L’option CTAS est la méthode de chargement la plus efficace.
Si vous n’utilisez pas l’option CTAS, vous devriez pouvoir charger jusqu’à environ 1 million d’enregistrements par minute. Toutefois, cette approximation dépend de la structure de la table (par exemple, la taille des enregistrements, les enregistrements plus volumineux étant plus lents à charger). Si vos opérations de chargement prennent trop de temps et échouent, testez avec un ensemble de données plus petit ou divisez vos chargements en morceaux plus petits.
Lorsque des index sont créés 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".
où IDX_HT100_COLS
est le nom d’un index de 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.
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 targethybridtable (
col1 VARCHAR(32) PRIMARY KEY,
col2 NUMBER(38,0) UNIQUE,
col3 NUMBER(38,0),
INDEX index_col3 (col3)
)
AS SELECT col1, col2, col3 FROM sourcetable);
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.
Toutefois, si votre application de table hybride est en mode de développement ou de 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 à l’aide de la commande CTAS. Le chemin rapide de chargement par lot fourni par la commande CTAS est plus efficace que la construction d’un index en ligne avec la commande CREATE INDEX.
Une table hybride nécessite une clé primaire unique. Les données de votre table sont trié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.