Mit dem CREATE TABLE AS-Befehl können Sie eine Tabelle erstellen, die auf den
Ergebnissen einer SELECT-Anweisung basiert.
Der Name dieses Befehls wird manchmal mit CTAS abgekürzt.
Der CREATE TABLE AS-Befehl hat die folgenden Merkmale:
- Allgemeine Tasks
- Mit dem CREATE TABLE AS-Befehl können Sie eine Tabelle erstellen und sie mit Daten
aus einem SELECT-Befehl füllen:
- Tabellenspalten haben die Namen und Datentypen, die den Ausgabespalten des
SELECT-Befehls zugeordnet sind, es sei denn, Sie überschreiben die Spaltennamen, indem
Sie eine explizite Liste mit neuen Spaltennamen bereitstellen.
- Der CREATE TABLE AS-Befehl erstellt eine Tabelle und wertet die Abfrage ein Mal aus,
um die neue Tabelle anfänglich zu füllen.
Die neue Tabelle verfolgt nicht die nachfolgend an den Quellentabellen der Abfrage
vorgenommenen Änderungen.
(Im Gegensatz dazu werden jedes Mal, wenn Sie eine Ansicht abfragen, die zugrunde liegenden
SELECT-Befehle erneut ausgewertet.)
- Automatische Statistik bei kurzen CTAS-Befehlen unterdrücken
- Bei CTAS-Operationen führt
IBM® Netezza
normalerweise GENERATE STATISTICS nach der CTAS-Operation aus, um Statistikdaten zur
erstellten Tabelle zu erfassen.
Bei kürzeren Tabellenabfragen jedoch kann der GENERATE STATISTICS-Prozess manchmal länger
dauern als die CTAS-Operation selbst.
Wenn eine CTAS-Operation übergeben wird, finden Tabellenerstellungs- und Einfügeoperationen statt.
Während der INSERT-Operation berechnet
Netezza die
Mindest- und Maximalwerte sowie die Zonenmaps für alle Spalten.
Wenn die INSERT-Operation eine Zeilenanzahl ergibt, die kleiner als der konfigurierte Grenzwert
(ctas_auto_stats_min_rows) ist, überspringt Netezza die
GENERATE STATISTICS-Operation.
In der Datei
postgresql.conf gibt es zwei Einstellungen, die dieses Feature steuern:
- enable_small_ctas_autostats aktiviert oder inaktiviert das Feature für die
Unterdrückung der automatischen Statistik für kleine Tabellen.
Die Einstellung ist standardmäßig aktiviert.
- ctas_autostats_min_rows gibt den Schwellenwert für eine kleine Tabelle an.
Netezza berechnet
keine Statistik für Tabellen, die unter diesem Schwellenwert liegen.
Der Standardwert ist 10000.
- Verteilungsschlüssel handhaben
- Wenn Sie keine expliziten Verteilungsschlüssel definieren, übernimmt eine
CTAS-Tabelle ihre Verteilung von der übergeordneten Tabelle.
Im Allgemeinen wird die Verteilung der Zieltabelle vom letzten Knoten im Plan definiert.
Wenn der letzte Knoten eine gültige Verteilung hat, weist das System die betreffende Verteilung dem
CTAS-Ziel zu. Nur wenn der letzte Planknoten keine Verteilung aufweist (wie
beispielsweise ein Knoten am Host), verwendet das System standardmäßig die erste Spalte der Tabelle.
Als Standardverteilungsschlüssel dient die erste Spalte (Hashverteilung), wenn kein
erkennbarer Verteilungsschlüssel vorhanden ist oder der Quellendatenstrom in die
CTAS-Tabelle eine Umlaufverteilung aufweist.
Tabelle
t_one übernimmt ihre Verteilungsschlüssel aus
f_one. (Es wird nicht standardmäßig die erste Spalte verwendet.)
CREATE TABLE t_one AS SELECT … FROM tbl …;
Tabelle
t_two übernimmt ihre Verteilungsschlüssel aus der Jointabelle (tbl_one+tbl_two),
bei denen es sich um deren Joinschlüssel handeln würde.
CREATE TABLE t_two AS SELECT … FROM tbl_one,tbl_two … WHERE
tbl_one.b1 = tbl_two.b2 …
Tabelle
t_three übernimmt ihre Verteilungsschlüssel aus dem Gruppierungsknoten; es handelt sich dabei um
(b1,b2,b3).
CREATE TABLE t_three AS SELECT … FROM tbl_one, tbl_two, tbl_three…
WHERE … GROUP BY b1,b2,b3;
- Systemstandardwert für Tabellenverteilungen
- Die postgresql.conf-Einstellung
enable_random_table_distribute steuert das Standardverteilungsverhalten, wenn Tabellen erstellt werden.
Der Standardwert 0 (inaktiviert) gibt das folgende Verhalten an, bei dem es sich um das
Standardverhalten für Tabellen handelt, die in früheren Releases erstellt wurden.
- Für eine CREATE TABLE-Operation:
- Wird DISTRIBUTE ON angegeben, wird der angegebene Verteilungsmechanismus verwendet.
- Wird DISTRIBUTE ON nicht angegeben, wird die erste Spalte als Standardverteilungsschlüssel verwendet.
- Für eine CREATE TABLE AS-Operation (CTAS-Operation):
- Wird DISTRIBUTE ON angegeben, wird der angegebene Verteilungsmechanismus verwendet.
- Wird DISTRIBUTE ON nicht angegeben, werden die Verteilungsschlüssel aus dem Plan übernommen.
Wenn der Planer keine Verteilung anhand des Plans ermitteln kann, wird die erste Spalte
als Standardschlüssel verwendet.
Wenn Sie
enable_random_table_distribute=1 (aktiviert)
angeben, ändert sich das Systemverhalten wie folgt:
- Für eine CREATE TABLE-Operation:
- Wird DISTRIBUTE ON angegeben, wird der angegebene Verteilungsmechanismus verwendet.
- Wird DISTRIBUTE ON nicht angegeben, wird die zufällige Verteilungsmethode (RANDOM) verwendet.
- Für eine CREATE TABLE AS-Operation (CTAS-Operation):
- Wird DISTRIBUTE ON angegeben, wird der angegebene Verteilungsmechanismus verwendet.
- Wird DISTRIBUTE ON nicht angegeben, werden die Verteilungsschlüssel aus dem Plan übernommen.
Wenn der Planer keine Verteilung anhand des Plans ermitteln kann, wird die zufällige
Verteilungsmethode (RANDOM) verwendet.
In manchen Fällen ist der Planer möglicherweise nicht in der
Lage, eine Verteilung anhand des Plans zu ermitteln.
Beispiel:
- Wenn ein letzter Join auf dem Host ausgeführt wird, dann kann die Verteilung des Ergebnisses
des betreffenden Joins nicht ermittelt werden.
- Wenn die Verteilungsspalte in der <Auswahlliste> fehlt, dann kann die
Verteilung nicht ermittelt werden.
- Wenn die Verteilung des letzten Ergebnisknotens zufällig ist, wird die Verteilung als nicht ermittelbar betrachtet.
- Wenn der letzte Join ein vollständiger Outer Join ist, dann kann die Verteilung
ebenfalls nicht ermittelt werden.
Diese Änderung führt dazu, dass die Umgebungsvariable NZ_DISABLE_SKEW_DEFENSE, die dieses Verhalten in
früheren Releases gesteuert hat, veraltet ist.
Das Upgrade auf Release 4.6 prüft auf das Vorliegen der Variablen und, falls sie festgelegt
ist, verwendet es ihren Wert, um enable_random_table_distribute auf den entsprechenden Wert der Variablen zu setzen.
Gehen Sie wie folgt vor, um die
postgresql.conf-Variable zu ändern:
- Öffnen Sie die Konfigurationsdatei nz/data/postgresql.conf mit einem Standardeditor.
- Suchen Sie die Zeile, die die Angabe enable_random_table_distribute = 0 enthält.
- Ändern Sie die Variable von 0 in 1 und speichern Sie die Änderung.
- Starten Sie das Netezza-System erneut, damit die Änderungen wirksam werden.
Syntax
Syntax für die Verwendung des CREATE TABLE AS-Befehls:
CREATE [ TEMPORARY | TEMP ] TABLE <Tabelle> [ (<Spalte>[,<Spalte>…] ) ]
AS <Auswahlklausel> [ DISTRIBUTE ON ( <Verteilungsspalte>[,<Verteilungsspalte>…] ) ]
Eingaben
Der CREATE TABLE AS-Befehl akzeptiert folgende Eingaben:
Tabelle 1. Eingaben für CREATE TABLE AS| Eingabe |
Beschreibung |
| TEMPORARY oder TEMP |
Temporäre Tabelle erstellen. |
| <Tabelle> |
Der Name der zu erstellenden Tabelle. Eine temporäre Tabelle kann
denselben Namen haben wie eine bereits vorhandene permanente Tabelle, aber andere
Tabellennamen müssen innerhalb des Geltungsbereichs der Datenbank eindeutig sein. |
| <Spalte> |
Der Name einer Spalte in der neuen Tabelle. Wenn Sie keinen Spaltennamen angeben,
wird der Name der Ausgabespalte in der Auswahlklausel übernommen. |
<Auswahl-
klausel> |
Ein in SELECT (zum Abrufen von Zeilen) beschriebener SELECT-Befehl. |
<Verteilungs-
spalte> |
Der Name einer Verteilungsspalte. Weitere Informationen zu
Verteilungsspalten finden Sie im Abschnitt zur Handhabung von Verteilungsschlüsseln in
Berechtigungen. |
Ausgaben
Eine Liste der möglichen
Ausgabenachrichten finden Sie in den Erläuterungen zum CREATE TABLE- und SELECT-Befehl.
Berechtigungen
Sie müssen der Benutzer mit
Administratorberechtigung oder der Eigner der Datenbank oder des Schemas sein oder Sie müssen
über die Berechtigung zum Erstellen von Tabellen verfügen.
Sie müssen außerdem Auswahlberechtigung für die Tabelle haben, die Sie in der SELECT-Anweisung verwenden.
Verwendung
Es folgt ein Verwendungsbeispiel.