CREATE TABLE AS
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.
- Allgemeine Aufgaben
- 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
- Während CTAS-Operationen führt Netezza Performance Server normalerweise GENERATE STATISTICS im Anschluss an die CTAS-Operation aus, um Statistiken über die erstellte Tabelle zu sammeln. 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 des Einfügevorgangs berechnet der Netezza Performance Server die Minimal- und Maximalwerte sowie die Zonenzuordnungen für alle Spalten. Wenn der Einfügevorgang eine Anzahl von Zeilen ergibt, die unter dem konfigurierten Schwellenwert (ctas_auto_stats_min_rows) liegt, überspringt Netezza Performance Server den Vorgang zur Erstellung von Statistiken.
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. Diese Einstellung ist standardmäßig aktiviert.
- ctas_autostats_min_rows gibt den Schwellenwert für eine kleine Tabelle an. Netezza Performance Server berechnet keine Statistiken 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 bei der Erstellung von Tabellen. 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. Zum 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, 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 "
the enable_random_table_distribute = 0enthält. - Ändern Sie die Variable von 0 in 1 und speichern Sie die Änderung.
- Starten Sie das Netezza Performance Server neu, damit die Änderungen wirksam werden.
- Für eine CREATE TABLE-Operation:
Syntax
CREATE [ TEMPORARY | TEMP ] TABLE <table> [ (<col>[,<col>…] ) ]
AS <select_clause> [ DISTRIBUTE ON ( <dist_col>[,<dist_col>…] ) ]
[ ORGANIZE ON { (<col>) | NONE } ]
[ BACKUP { OFF | DATA OFF | ON } ]
[ DATA_VERSION_RETENTION_TIME <number-of-days> ]
[ STORAGETYPE { 'BLOCK' | 'OBJECT' } ]Eingaben
| 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. |
| <Auswahlklausel> | Ein SELECT-Befehl wie in SELECT (zum Abrufen von Zeilen) beschrieben. |
| <Verteilungsspalte> | Der Name einer Verteilungsspalte. Weitere Informationen zu Verteilungsspalten finden Sie unter "Umgang mit Verteilungsschlüsseln" in Privilegien. |
| ORGANIZE ON | Spalten (von eins bis vier), anhand derer die Tabelle organisiert werden soll. Dies kann für externe Tabellen nicht angegeben werden. Wenn Spalten angegeben werden, kann es für die Tabelle keine materialisierten Ansichten geben. Außerdem ist es erforderlich, dass alle angegebenen Spaltendatentypen in einer Zonenmap dargestellt werden können. Die Tabellendatenumorganisation tritt in Kraft, wenn GROOM TABLE ausgeführt wird. |
| DATA_VERSION_RETENTION_TIME <Anzahl der Tage> | Erzeugt eine Tabelle mit einer Verweildauer. Sie müssen DATA_VERSION_RETENTION_TIME angeben, wenn Sie Zeitreiseabfragen durchführen wollen. Der Standardwert ist 0. Der maximal zulässige Wert beträgt 99 Tage. Wenn DATA_VERSION_RETENTION_TIME nicht angegeben ist, wird sie auf die aktuelle Aufbewahrungszeit gesetzt, die für das Schema der Tabelle angegeben wurde. Wenn die Verweildauer auf 0 gesetzt wird, ist die Tabelle keine Zeitreisetabelle mehr, und es sind keine historischen Daten für die Tabelle für Zeitreiseabfragen verfügbar. Sie können keine Zeitreiseabfragen für Objekte durchführen, deren Verweildauer auf 0 gesetzt ist. Wenn die Verweildauer auf einen Wert ungleich Null gesetzt ist, handelt es sich um eine Zeitreisetabelle. Historische Zeilen, die die durch DATA_VERSION_RETENTION_TIME angegebene Anzahl von Tagen zurückreichen, sind für Zeitreiseabfragen verfügbar. Sie können DATA_VERSION_RETENTION_TIME nicht mit CREATE TEMPORARY TABLE verwenden. Alle temporären Tabellen sind nicht zeitabhängig und unterstützen keine zeitabhängigen Abfragen. Weitere Informationen über Zeitreisen und DATA_VERSION_RETENTION_TIME finden Sie unter Erste Schritte mit Zeitreisen. |
| Speichertyp<storage_type> | Geben Sie den Zielspeicher für die Tabelle an ( |
Ausgaben
Eine Liste der möglichen Ausgabenachrichten finden Sie in den Erläuterungen zum CREATE TABLE- und SELECT-Befehl.
Zugriffsrechte
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
Im Folgenden ist ein Verwendungsbeispiel angegeben.
- Angenommen, Sie haben die folgende Tabelle mit Namen
cows:cnumber | cname | cbreed | ckind ---------+--------+-------------+------- 3 | Cindy | Ayrshire | milk 8 | Muffin | Guernsey | milk 2 | Martha | Brown Swiss | milk 7 | Joe | Angus | beef 5 | Gretel | Highland | beef 1 | Betsy | Holstein | milk 6 | Bob | Angus | beef 4 | Mindy | Hereford | beef 9 | Milda | Jersey | milkErstellen Sie eine Tabelle anhand von zwei Spalten der Tabellecows:MYDB.SCH1(USER)=> CREATE TABLE cows2 AS SELECT cname, cbreed FROM cows;Als Ergebnis erhalten Sie eine neue Tabelle mit Namencows2:MYDB.SCH1(USER)=> SELECT * FROM cows2; cname | cbreed --------+------------- Cindy | Ayrshire Muffin | Guernsey Mindy | Hereford Milda | Jersey Betsy | Holstein Gretel | Highland Martha | Brown Swiss Joe | Angus Bob | Angus