Warum verbraucht eine Tabelle in einem Amazon Redshift-Cluster mehr oder weniger Festplattenspeicher als erwartet?

Lesedauer: 4 Minute
0

Eine Tabelle belegt mehr Speicherplatz als erwartet oder ein Prozentsatz des freien Festplattenspeichers hat sich nach meiner klassischen Größenänderung nicht erhöht. Wie berechnet Amazon Redshift den Festplattenspeicher und die Tabellengröße?

Lösung

Überprüfen der minimalen Tabellengröße

Die minimale Tabellengröße ist der kleinste Platzbedarf, den eine Tabelle in einem Amazon Redshift-Cluster hat. Sie können die minimale Tabellengröße überprüfen, wenn Sie die Cluster-Speichernutzung analysieren oder die Größe eines Amazon Redshift-Clusters ändern.

Verwenden Sie für Tabellen, die mit dem Verteilungsstil KEY, EVEN oder Auto (EVEN) erstellt wurden, die folgende Formel:

Minimum table size = block_size (1 MB) *
(number_of_user_columns + 3 system columns) * number_of_populated_slices * number_of_table_segments

Verwenden Sie für Tabellen, die mit dem Verteilungsstil ALL oder Auto (ALL) erstellt wurden, die folgende Formel:

Minimum table size = block_size (1 MB) *
(number_of_user_columns + 3 system columns) * number_of_cluster_nodes * number_of_table_segments

Bei den Tabellenformeln basiert die Anzahl der Segmente darauf, ob die Tabelle einen definierten Sortierschlüssel hat. Wenn eine Amazon Redshift-Tabelle einen definierten Sortierschlüssel hat, dann hat die Tabelle zwei Segmente: ein sortiertes Segment und ein unsortiertes Segment. Wenn eine Amazon Redshift-Tabelle keinen Sortierschlüssel hat, erzeugt die Tabelle nur ein unsortiertes Segment.

Sie können die Anzahl der befüllten Segmente mithilfe der folgenden Abfrage berechnen:

select count(distinct a.slice) as
number_of_populated_slices, b."table" from stv_blocklist a,
svv_table_info b where a.tbl = b.table_id group by b."table" ;

Beispiel: six dc2.large-Cluster

Beispielsweise kann ein six dc2.large-Cluster mit vier kleinen Tabellen mit derselben Struktur und Zeilenanzahl erstellt werden. Wenn der Cluster drei verschiedene Verteilungsstile und einen Verteilungsstil mit einem Sortierschlüssel verwendet, werden unterschiedliche Abfragen verwendet.

Die folgende Abfrage erstellt eine Tabelle mit einem ALL-Verteilungsstil (und einer Ausgabe von sechs ausgefüllten Segmenten):

create table testsize_all (a varchar(100),b varchar(100), c
varchar(100)) diststyle all;
insert into testsize_all values
('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c');

Die folgende Abfrage erstellt eine Tabelle mit einem EVEN-Verteilungsstil (und einer Ausgabe von sechs ausgefüllten Segmenten):

create table testsize_even (a varchar(100),b varchar(100), c
varchar(100)) diststyle even;
insert into testsize_even values
('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c');

Die folgende Abfrage erstellt eine Tabelle mit einem Verteilungsschlüssel (und einer Ausgabe eines aufgefüllten Segments):

create table testsize_key (a varchar(100),b varchar(100), c
varchar(100)) distkey (a);
insert into testsize_key values
('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c');

Die folgende Abfrage erstellt eine Tabelle mit einem Verteilungsschlüssel und einem Sortierschlüssel (und einer Ausgabe von sechs ausgefüllten Segmenten):

create table testsize_sort_even (a varchar(100),b
varchar(100), c varchar(100) ) diststyle even sortkey (a);
insert into testsize_sort_even values
('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c');

Berechnen der minimalen Tabellengröße

Verwenden Sie die folgende Formel, um die minimale Tabellengröße für einen EVEN-Verteilungsstil zu berechnen:

Minimum table size = block_size (1 MB) *
(number_of_user_columns + 3 system columns) * number_of_populated_slices *
number_of_table_segments
1MB * (3+3) * 6 *1 = 36MB

Verwenden Sie die folgende Formel, um die minimale Tabellengröße für einen ALL-Verteilungsstil zu berechnen:

Minimum table size = block_size (1 MB) *
(number_of_user_columns + 3 system columns) * number_of_cluster_nodes *
number_of_table_segments
1MB * (3+3) * 6 *1 = 36 MB

Verwenden Sie die folgende Formel, um die minimale Tabellengröße für einen KEY-Verteilungsstil zu berechnen:

Minimum table size = block_size (1 MB) * (number_of_user_columns
+ 3 system columns) * number_of_populated_slices * number_of_table_segments
1MB * (3+3) * 1 *1 = 6MB

Verwenden Sie die folgende Formel, um die minimale Tabellengröße für eine gleichmäßige Verteilung mit einem Sortierschlüssel zu berechnen:

Minimum table size = block_size (1 MB) *
(number_of_user_columns + 3 system columns) * number_of_populated_slices *
number_of_table_segments
1MB * (3+3) * 6 *2 = 72MB

Wie die Berechnungen zeigen, ist die Größe Ihrer Tabelle bei einer geringen Anzahl von eingefügten Zeilen größer als erwartet. Die Größe der Tabelle nimmt weiter zu, da die Anzahl der Zeilen eingefügt wird und die Anzahl der aufgefüllten Segmente zunimmt.

Wenn eine klassische Größenänderung durchgeführt wird, wächst die Anzahl der aufgefüllten Segmente, ohne dass das Datenvolumen für die Tabelle zunimmt. Infolgedessen wächst der freie Speicherplatz nach der Größenänderung nicht linear.


Verwandte Informationen

Bewährte Methoden für Amazon Redshift für das Entwerfen von Tabellen

Arbeiten mit automatischer Tabellenoptimierung

Spaltenabsierter Speicher

Auswählen des besten Sortierschlüssels

Arbeitsablauf für die Planung und Ausführung von Abfragen

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 2 Jahren