La commande CREATE TABLE AS permet de créer une table en fonction des résultats
d'une instruction SELECT. Cette commande est parfois abrégée en CTAS.
La commande CREATE TABLE AS possède les caractéristiques suivantes :
- Tâches usuelles
- La commande CREATE TABLE AS permet de créer une table et de la remplir avec les données
d'une commande select :
- Les colonnes de table possèdent les noms et les types de données associés aux colonnes de sortie de la commande SELECT, à moins que vous ne
remplaciez les noms de colonne en spécifiant une liste explicite de nouveaux noms de colonne.
- La commande CREATE TABLE AS crée une table et évalue la requête une fois pour remplir initialement
la nouvelle table. La nouvelle table ne recherche pas les modifications ultérieures apportées aux tables source de la requête. (Au lieu de cela,
chaque fois que vous interrogez une vue, elle réévalue les commandes SELECT sous-jacentes.)
- Suppression des statistiques automatiques sur les opérations CTAS de petite taille
- Lors des opérations CTAS, IBM® Netezza exécute généralement
GENERATE STATISTICS après l'opération CTAS pour collecter les statistiques sur la
table créée. Toutefois, pour les requêtes de table plus courtes, l'exécution du processus GENERATE
STATISTICS peut parfois prendre plus de temps que l'opération CTAS
elle-même.
Lorsqu'une opération CTAS est soumise, les opérations de création et d'insertion de table sont
effectuées. Lors de l'opération d'insertion, Netezza calcule les
valeurs minimales, les valeurs maximales et les mappes de zones de toutes les colonnes.
Si l'opération d'insertion génère un nombre de lignes inférieur au seuil configuré
(ctas_auto_stats_min_rows), Netezza ignore l'opération de génération des statistiques.
Deux paramètres du fichier
postgresql.conf contrôlent cette
fonction :
- enable_small_ctas_autostats active ou désactive la fonction pour supprimer
les statistiques automatiques sur les tables de petite taille. Ce paramètre est activé par défaut.
- ctas_autostats_min_rows spécifie le seuil pour une table de petite taille. Netezza ne calcule pas
les statistiques des tables qui se trouvent sous ce seuil.
La valeur par défaut est de 10000.
- Gestion des clés de distribution
- Si vous ne définissez pas de clés de distribution explicites, une table CTAS hérite de sa
distribution de la table parent. En général, la distribution
de la table cible est définie par le noeud final dans le plan. Si la distribution du noeud final
n'est pas valide, le système affecte cette distribution à la cible CTAS. Le système
n'utilise la première colonne de la table que si le noeud du plan final n'a pas de
distribution (comme pour un noeud sur l'hôte).
La clé de distribution par défaut est la
première colonne (distribution par hachage) dans laquelle il n'existe pas de clé de
distribution discernable ou le flux source dans la table CTAS a une distribution par permutation circulaire.
La table
t_one hérite de ses clés de distribution de f_one. (Elle n'utilise pas la première colonne
par défaut.)
CREATE TABLE t_one AS SELECT … FROM tbl …;
La table
t_two hérite de ses clés de distribution de la table de jointure de (tbl_one+tbl_two),
qui correspondent à leurs clés de jointure.
CREATE TABLE t_two AS SELECT … FROM tbl_one,tbl_two … WHERE
tbl_one.b1 = tbl_two.b2 …
La table t_three hérite de ses
clés de distribution du noeud de regroupement, à savoir (b1,b2,b3).
CREATE TABLE t_three AS SELECT … FROM tbl_one, tbl_two, tbl_three…
WHERE … GROUP BY b1,b2,b3;
- Valeur par défaut du système pour les distributions de table
- Le paramètre enable_random_table_distribute du fichier postgresql.conf contrôle le comportement de distribution par défaut lorsque des tables sont créées.
La valeur par défaut 0 (désactivé) spécifie le comportement suivant, qui est le comportement
par défaut pour les tables créées dans les versions précédentes :
- Pour une opération CREATE TABLe :
- Si DISTRIBUTE ON est spécifié, utilisez le mécanisme de distribution
spécifié.
- Si DISTRIBUTE ON n'est pas spécifié, utilisez la première colonne comme
clé de distribution par défaut.
- Pour une opération CREATE TABLE AS (CTAS) :
- Si DISTRIBUTE ON est spécifié, utilisez le mécanisme de distribution
spécifié.
- Si DISTRIBUTE ON n'est pas spécifié, les clés de distribution sont héritées du
plan. Si le planificateur ne parvient pas à déterminer une distribution à partir du
plan, utilisez la première colonne comme clé par défaut.
Si vous spécifiez enable_random_table_distribute=1 (activé),
le système change de comportement :
- Pour une opération CREATE TABLe :
- Si DISTRIBUTE ON est spécifié, utilisez le mécanisme de distribution
spécifié.
- Si DISTRIBUTE ON n'est pas spécifié, utilisez la méthode de distribution aléatoire.
- Pour une opération CREATE TABLE AS (CTAS) :
- Si DISTRIBUTE ON est spécifié, utilisez le mécanisme de distribution
spécifié.
- Si DISTRIBUTE ON n'est pas spécifié, les clés de distribution sont héritées du
plan. Si le planificateur ne parvient pas à déterminer une distribution à partir du
plan, utilisez la méthode de distribution aléatoire.
Dans certains cas, il se peut que le planificateur ne puisse pas déterminer
une distribution à partir du plan. Par exemple :
- En cas de jointure finale sur l'hôte, la distribution du résultat
de cette jointure est non déterministe.
- Si la colonne de distribution est manquante dans <select-list>,
la distribution est non déterministe.
- Si la distribution du noeud de résultat final est aléatoire, la distribution
est considérée comme non déterministe.
- Si la jointure finale est une jointure externe complète, la distribution
est non déterministe.
Cette modification rend obsolète la variable d'environnement NZ_DISABLE_SKEW_DEFENSE,
qui contrôlait ce comportement dans les versions antérieures. La mise à niveau vers la version
4.6 recherche la présence de la variable et, si elle est définie, utilise sa valeur
pour affecter à enable_random_table_distribute sa valeur correspondante.
Pour modifier la variable
postgresql.conf,
procédez comme suit :
- Utilisez un éditeur standard pour ouvrir le fichier de configuration, nz/data/postgresql.conf.
- Recherchez la ligne contenant the enable_random_table_distribute = 0.
- Remplacez la valeur 0 de la variable par 1 et sauvegardez la modification.
- Redémarrez le système Netezza pour que les modifications
soient appliquées.
Syntaxe
Syntaxe d'utilisation de la commande CREATE TABLE As :
CREATE [ TEMPORARY | TEMP ] TABLE <table> [ (<col>[,<col>…] ) ]
AS <clause_select> [ DISTRIBUTE ON ( <col_dist>[,<col_dist>…] ) ]
Entrées
La commande CREATE TABLE AS
accepte les entrées suivantes :
Tableau 1. Entrées de la commande CREATE TABLE AS| Entrée |
Description |
| TEMPORARY ou TEMP |
Crée une table temporaire. |
| <table> |
Nom de la table à créer. Une table temporaire
peut posséder le même nom qu'une table permanente qui existe déjà,
mais les autres noms de table doivent être uniques dans la portée d'une base de données. |
| <col> |
Nom d'une colonne dans la nouvelle table. Si vous ne spécifiez pas de nom de colonne,
un nom est extrait du nom de la colonne en sortie de la clause select. |
| <clause_select> |
Commande SELECT comme décrit dans SELECT (pour extraire des lignes). |
| <col_dist> |
Nom d'une colonne de distribution. Pour plus d'informations sur les
colonnes de distribution, voir "Gestion des clés de distribution" dans la section Droits. |
Sorties
Pour une liste des messages de sortie possibles, voir les commandes CREATE TABLE
et SELECT.
Droits
Vous devez être administrateur,
propriétaire de la base de données ou du schéma ou disposer des droits
Create Table. Vous devez également disposer des droits Select pour la
table que vous utilisez dans l'instruction SELECT.
Syntaxe
Voici un exemple de syntaxe :