Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Analysieren von Tabellen
Der ANALYZE Vorgang aktualisiert die statistischen Metadaten, die der Abfrageplaner zur Auswahl optimaler Pläne verwendet.
In den meisten Fällen müssen Sie den ANALYZE Befehl nicht explizit ausführen. Amazon Redshift überwacht Änderungen an Ihrer Workload und aktualisiert die Statistik im Hintergrund automatisch. Darüber hinaus führt der COPY Befehl automatisch eine Analyse durch, wenn Daten in eine leere Tabelle geladen werden.
Wenn Sie eine Tabelle oder die gesamte Datenbank explizit analysieren möchten, führen Sie den Befehl ANALYZE aus.
Automatische Analyse
Amazon Redshift überwacht fortlaufend Ihre Datenbank und führt automatisch Analyseoperationen im Hintergrund durch. Um die Auswirkungen auf die Systemperformance zu minimieren, wird die automatischen Analyse in Zeiten ausgeführt, in denen der Workload gering ist.
Die automatische Analyse ist standardmäßig aktiviert. Um die automatische Analyse zu deaktivieren, legen Sie für den Parameter auto_analyze
den Wert false
fest, indem Sie die Parametergruppe Ihres Clusters entsprechend ändern.
Zur Verkürzung der Verarbeitungszeit und zur Verbesserung der allgemeinen Systemleistung überspringt Amazon Redshift die automatische Analyse bei Tabellen mit nur geringen Änderungen.
Bei einem Analysevorgang werden Tabellen mit up-to-date Statistiken übersprungen. Wenn Sie den Vorgang im ANALYZE Rahmen Ihres Workflows zum Extrahieren, Transformieren und Laden (ETL) ausführen, werden bei der automatischen Analyse Tabellen mit aktuellen Statistiken übersprungen. In ähnlicher Weise werden Tabellen explizit ANALYZE übersprungen, wenn die automatische Analyse die Statistiken der Tabelle aktualisiert hat.
Analyse neuer Tabellendaten
Standardmäßig führt der COPY Befehl eine aus, ANALYZE nachdem er Daten in eine leere Tabelle geladen hat. Sie können einen ANALYZE unabhängig davon, ob eine Tabelle leer ist, erzwingen, indem Sie STATUPDATE ON setzen. Wenn Sie angeben STATUPDATEOFF, ANALYZE wird ein nicht ausgeführt. Nur der Tabellenbesitzer oder ein Superuser kann den Befehl ausführen oder den ANALYZE Befehl ausführen, wenn er auf ON STATUPDATE gesetzt ist. COPY
Amazon Redshift analysiert auch automatisch neue Tabellen, die mit den folgenden Befehlen erstellt werden:
-
CREATETABLEALS () CTAS
-
CREATETEMPTABLEALS
-
SELECT INTO
Wenn Sie eine Abfrage für eine neue Tabelle ausführen, die nach dem anfänglichen Laden der Daten noch nicht analysiert wurde, gibt Amazon Redshift eine Warnung zurück. Wenn Sie jedoch dieselbe Tabelle nach einem anschließenden Aktualisierungs- oder Ladevorgang eine Abfrage ausführen, wird keine Warnung angezeigt. Dieselbe Warnmeldung wird zurückgegeben, wenn Sie den EXPLAIN Befehl für eine Abfrage ausführen, die auf Tabellen verweist, die nicht analysiert wurden.
Wenn Sie einer nichtleeren Tabelle eine bedeutende Menge von Daten hinzufügen, können Sie die Statistik explizit aktualisieren. Sie tun dies, indem Sie entweder einen ANALYZE Befehl ausführen oder die Option STATUPDATE ON zusammen mit dem COPY Befehl verwenden. Um Details zur Anzahl der Zeilen anzuzeigen, die seit der letzten Zeile eingefügt oder gelöscht wurdenANALYZE, fragen Sie die PG_ _ STATISTIC INDICATOR Systemkatalogtabelle ab.
Sie können den Geltungsbereich für den Befehl ANALYZE auf eine der folgenden Einstellungen festlegen:
-
Die gesamte aktuelle Datenbank
-
Eine einzelne Tabelle
-
Eine oder mehrere spezifische Spalten in einer einzelnen Tabelle
-
Spalten, die in Abfragen wahrscheinlich als Prädikate verwendet werden
Der ANALYZE Befehl ruft eine Stichprobe von Zeilen aus der Tabelle ab, führt einige Berechnungen durch und speichert die resultierenden Spaltenstatistiken. Standardmäßig führt Amazon Redshift einen Probendurchlauf für die DISTKEY Spalte und einen weiteren Probendurchlauf für alle anderen Spalten in der Tabelle durch. Wenn Sie Statistiken für einen Teilsatz von Spalten generieren möchten, können Sie eine durch Komma getrennte Spaltenliste angeben. Sie können die PREDICATE COLUMNS Klausel verwenden, um Spalten zu überspringen, die nicht als Prädikate verwendet werden. ANALYZE
ANALYZEOperationen sind ressourcenintensiv. Führen Sie sie daher nur für Tabellen und Spalten aus, für die tatsächlich Statistikaktualisierungen erforderlich sind. Sie müssen nicht regelmäßig oder zu gleichen Termin alle Spalten in allen Tabellen analysieren. Wenn sich die Daten wesentlich verändern, analysieren Sie die Spalten, die häufig bei Folgendem verwendet werden:
-
Sortierungs- und Gruppierungsoperationen
-
Joins
-
Abfrageprädikate
Um die Verarbeitungszeit zu reduzieren und die Gesamtsystemleistung zu verbessern, überspringt ANALYZE Amazon Redshift jede Tabelle, die einen geringen Prozentsatz an geänderten Zeilen hat, wie durch den analyze_threshold_percent Parameter bestimmt. Standardmäßig ist der Analyseschwellenwert auf 10 Prozent festgelegt. Sie können den Analyseschwellenwert für die aktuelle Sitzung durch die Ausführung eines SET-Befehls ändern.
Spalten, bei denen es weniger wahrscheinlich ist, dass sie häufig analysiert werden müssen, sind solche, die Fakten und Kennzahlen sowie alle zugehörigen Attribute darstellen, die eigentlich nie abgefragt werden, wie z. B. große Spalten. VARCHAR Betrachten Sie zum Beispiel die LISTING Tabelle in der TICKIT Datenbank.
select "column", type, encoding, distkey, sortkey from pg_table_def where tablename = 'listing';
column | type | encoding | distkey | sortkey ---------------+--------------------+----------+---------+--------- listid | integer | none | t | 1 sellerid | integer | none | f | 0 eventid | integer | mostly16 | f | 0 dateid | smallint | none | f | 0 numtickets | smallint | mostly8 | f | 0 priceperticket | numeric(8,2) | bytedict | f | 0 totalprice | numeric(8,2) | mostly32 | f | 0 listtime | timestamp with... | none | f | 0
Wenn diese Tabelle täglich mit einer großen Anzahl neuer Datensätze geladen wird, muss die LISTID Spalte, die häufig in Abfragen als Join-Schlüssel verwendet wird, regelmäßig analysiert werden. Wenn TOTALPRICE und LISTTIME sind die häufig verwendeten Einschränkungen in Abfragen, können Sie diese Spalten und den Verteilungsschlüssel an jedem Wochentag analysieren.
analyze listing(listid, totalprice, listtime);
Nehmen wir an, die Verkäufer und Ereignisse in der Anwendung sind viel statischer und das Datum IDs bezieht sich auf eine feste Anzahl von Tagen, die nur zwei oder drei Jahre umfassen. In diesem Fall ändern sich die jeweiligen Werte für diese Spalten nicht wesentlich. Die Anzahl der Instances der einzelnen spezifischen Werte wird jedoch stetig steigen.
Denken Sie außerdem an den Fall, dass die PRICEPERTICKET Kennzahlen NUMTICKETS und im Vergleich zur Spalte selten abgefragt werden. TOTALPRICE In diesem Fall können Sie den ANALYZE Befehl einmal am Wochenende für die gesamte Tabelle ausführen, um die Statistiken für die fünf Spalten zu aktualisieren, die nicht täglich analysiert werden:
Prädikatsspalten
Eine bequeme Alternative zur Angabe einer Spaltenliste stellt die Analyse nur der Spalten dar, die wahrscheinlich als Prädikate verwendet werden. Wenn Sie eine Abfrage ausführen, werden alle Spalten, die in einem Join, einer Filterbedingung oder einer GROUP BY-Klausel verwendet werden, im Systemkatalog als Prädikatsspalten markiert. Wenn Sie die ANALYZE PREDICATE COLUMNS Klausel verwenden, umfasst der Analysevorgang nur Spalten, die die folgenden Kriterien erfüllen:
-
Die Spalte ist als Prädikatsspalte markiert.
-
Die Spalte ist ein Verteilungsschlüssel.
-
Die Spalte ist Teil eines Sortierschlüssels.
Wenn keine der Spalten einer Tabelle als Prädikat markiert ist, werden alle Spalten ANALYZE eingeschlossen, auch wenn es angegeben PREDICATE COLUMNS ist. Wenn keine Spalten als Prädikatspalten markiert sind, kann dies daran liegen, dass für die Tabelle noch keine Abfrage ausgeführt wurde.
Sie können diese Option verwenden, PREDICATE COLUMNS wenn das Abfragemuster Ihres Workloads relativ stabil ist. Wenn das Abfragemuster variabel ist und häufig verschiedene Spalten als Prädikate verwendet werden, PREDICATE COLUMNS kann die Verwendung vorübergehend zu veralteten Statistiken führen. Veraltete Statistiken können zu nicht optimalen Abfrageausführungszeitplänen und langen Ausführungszeiten führen. Wenn Sie using das nächste Mal ausführenANALYZE, sind die neuen Prädikatspalten jedoch enthalten. PREDICATE COLUMNS
Gehen Sie wie folgt vor, um Details für Prädikatspalten anzuzeigen, SQL um eine Ansicht mit dem Namen PREDICATE _ zu erstellen. COLUMNS
CREATE VIEW predicate_columns AS WITH predicate_column_info as ( SELECT ns.nspname AS schema_name, c.relname AS table_name, a.attnum as col_num, a.attname as col_name, CASE WHEN 10002 = s.stakind1 THEN array_to_string(stavalues1, '||') WHEN 10002 = s.stakind2 THEN array_to_string(stavalues2, '||') WHEN 10002 = s.stakind3 THEN array_to_string(stavalues3, '||') WHEN 10002 = s.stakind4 THEN array_to_string(stavalues4, '||') ELSE NULL::varchar END AS pred_ts FROM pg_statistic s JOIN pg_class c ON c.oid = s.starelid JOIN pg_namespace ns ON c.relnamespace = ns.oid JOIN pg_attribute a ON c.oid = a.attrelid AND a.attnum = s.staattnum) SELECT schema_name, table_name, col_num, col_name, pred_ts NOT LIKE '2000-01-01%' AS is_predicate, CASE WHEN pred_ts NOT LIKE '2000-01-01%' THEN (split_part(pred_ts, '||',1))::timestamp ELSE NULL::timestamp END as first_predicate_use, CASE WHEN pred_ts NOT LIKE '%||2000-01-01%' THEN (split_part(pred_ts, '||',2))::timestamp ELSE NULL::timestamp END as last_analyze FROM predicate_column_info;
Angenommen, Sie führen die folgende Abfrage für die LISTING Tabelle aus. Beachten SieLISTID, dassLISTTIME, und EVENTID in den Join-, Filter- und Group By-Klauseln verwendet werden.
select s.buyerid,l.eventid, sum(l.totalprice) from listing l join sales s on l.listid = s.listid where l.listtime > '2008-12-01' group by l.eventid, s.buyerid;
Wenn Sie die COLUMNS Ansicht PREDICATE _ abfragen, wie im folgenden Beispiel gezeigt, sehen Sie, dass LISTIDEVENTID, und als Prädikatspalten markiert LISTTIME sind.
select * from predicate_columns where table_name = 'listing';
schema_name | table_name | col_num | col_name | is_predicate | first_predicate_use | last_analyze ------------+------------+---------+----------------+--------------+---------------------+-------------------- public | listing | 1 | listid | true | 2017-05-05 19:27:59 | 2017-05-03 18:27:41 public | listing | 2 | sellerid | false | | 2017-05-03 18:27:41 public | listing | 3 | eventid | true | 2017-05-16 20:54:32 | 2017-05-03 18:27:41 public | listing | 4 | dateid | false | | 2017-05-03 18:27:41 public | listing | 5 | numtickets | false | | 2017-05-03 18:27:41 public | listing | 6 | priceperticket | false | | 2017-05-03 18:27:41 public | listing | 7 | totalprice | false | | 2017-05-03 18:27:41 public | listing | 8 | listtime | true | 2017-05-16 20:54:32 | 2017-05-03 18:27:41
Wenn die Statistiken aktuell sind, kann dies die Leistung bei Abfragen verbessern, weil die Abfrageplanung dann optimale Pläne auswählen kann. Amazon Redshift aktualisiert Statistiken automatisch im Hintergrund, und Sie können den ANALYZE Befehl auch explizit ausführen. Wenn Sie sich für die explizite Ausführung entscheidenANALYZE, gehen Sie wie folgt vor:
-
Führen Sie den ANALYZE Befehl aus, bevor Sie Abfragen ausführen.
-
Führen Sie den ANALYZE Befehl routinemäßig am Ende jedes regulären Lade- oder Aktualisierungszyklus in der Datenbank aus.
-
Führen Sie den ANALYZE Befehl für alle neuen Tabellen aus, die Sie erstellen, und für alle vorhandenen Tabellen oder Spalten, an denen wesentliche Änderungen vorgenommen wurden.
-
Erwägen Sie, ANALYZE Operationen nach unterschiedlichen Zeitplänen für verschiedene Tabellen- und Spaltentypen auszuführen, je nachdem, wie sie in Abfragen verwendet werden und wie häufig sie sich ändern.
-
Verwenden Sie bei der Ausführung die PREDICATE COLUMNS Klausel, um Zeit zu sparen und Ressourcen zu bündeln. ANALYZE
Sie müssen den ANALYZE Befehl nicht explizit ausführen, nachdem Sie einen Snapshot in einem bereitgestellten Cluster oder serverlosen Namespace wiederhergestellt haben, und auch nicht, nachdem Sie einen angehaltenen bereitgestellten Cluster wieder aufgenommen haben. Amazon Redshift behält in diesen Fällen Systemtabelleninformationen bei, sodass manuelle ANALYZE Befehle nicht erforderlich sind. Amazon Redshift wird bei Bedarf weiterhin automatische Analysevorgänge ausführen.
Bei einem Analysevorgang werden Tabellen mit Statistiken übersprungen. up-to-date Wenn Sie den Vorgang im ANALYZE Rahmen Ihres Workflows zum Extrahieren, Transformieren und Laden (ETL) ausführen, werden bei der automatischen Analyse Tabellen mit aktuellen Statistiken übersprungen. In ähnlicher Weise werden Tabellen explizit ANALYZE übersprungen, wenn die automatische Analyse die Statistiken der Tabelle aktualisiert hat.
ANALYZEBefehlsverlauf
Es ist nützlich zu wissen, wann der letzte ANALYZE Befehl in einer Tabelle oder Datenbank ausgeführt wurde. Wenn ein ANALYZE Befehl ausgeführt wird, führt Amazon Redshift mehrere Abfragen aus, die wie folgt aussehen:
padb_fetch_sample: select * from table_name
Query STL _ANALYZE, um den Verlauf der Analysevorgänge einzusehen. Wenn Amazon Redshift eine Tabelle automatisch analysiert, wird für die Spalte is_background
der Wert t
(true) festgelegt. Andernfalls lautet der Wert f
(false). Im folgenden Beispiel werden _ STV TBL _ verknüpftPERM, um den Tabellennamen und die Laufzeitdetails anzuzeigen.
select distinct a.xid, trim(t.name) as name, a.status, a.rows, a.modified_rows, a.starttime, a.endtime from stl_analyze a join stv_tbl_perm t on t.id=a.table_id where name = 'users' order by starttime;
xid | name | status | rows | modified_rows | starttime | endtime -------+-------+-----------------+-------+---------------+---------------------+-------------------- 1582 | users | Full | 49990 | 49990 | 2016-09-22 22:02:23 | 2016-09-22 22:02:28 244287 | users | Full | 24992 | 74988 | 2016-10-04 22:50:58 | 2016-10-04 22:51:01 244712 | users | Full | 49984 | 24992 | 2016-10-04 22:56:07 | 2016-10-04 22:56:07 245071 | users | Skipped | 49984 | 0 | 2016-10-04 22:58:17 | 2016-10-04 22:58:17 245439 | users | Skipped | 49984 | 1982 | 2016-10-04 23:00:13 | 2016-10-04 23:00:13 (5 rows)
Alternativ können Sie eine komplexere Abfrage ausführen, die alle Anweisungen zurückgibt, die in jeder abgeschlossenen Transaktion ausgeführt wurden, die einen ANALYZE Befehl enthielt:
select xid, to_char(starttime, 'HH24:MM:SS.MS') as starttime, datediff(sec,starttime,endtime ) as secs, substring(text, 1, 40) from svl_statementtext where sequence = 0 and xid in (select xid from svl_statementtext s where s.text like 'padb_fetch_sample%' ) order by xid desc, starttime;
xid | starttime | secs | substring -----+--------------+------+------------------------------------------ 1338 | 12:04:28.511 | 4 | Analyze date 1338 | 12:04:28.511 | 1 | padb_fetch_sample: select count(*) from 1338 | 12:04:29.443 | 2 | padb_fetch_sample: select * from date 1338 | 12:04:31.456 | 1 | padb_fetch_sample: select * from date 1337 | 12:04:24.388 | 1 | padb_fetch_sample: select count(*) from 1337 | 12:04:24.388 | 4 | Analyze sales 1337 | 12:04:25.322 | 2 | padb_fetch_sample: select * from sales 1337 | 12:04:27.363 | 1 | padb_fetch_sample: select * from sales ...