Pourquoi une table d'un cluster Amazon Redshift utilise-t-elle plus ou moins d'espace de stockage sur disque que prévu ?

Date de la dernière mise à jour : 24/11/2020

Une table occupe plus d'espace disque que prévu ou un pourcentage d'espace disque disponible n'a pas augmenté après mon redimensionnement classique. Comment Amazon Redshift calcule-t-il le stockage sur disque et la taille de la table ?

Résolution

Vérification de la taille minimale de la table

La taille minimale de la table correspond à la plus petite empreinte qu'une table a sur un cluster Amazon Redshift. Vous pouvez vérifier la taille minimale de la table lors de l'analyse de l'utilisation du stockage du cluster ou lors du redimensionnement d'un cluster Amazon Redshift.

Pour les tables créées à l'aide du style de distribution KEY, EVEN ou Auto (EVEN), utilisez la formule suivante :

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

Pour les tables créées à l'aide du style de distribution ALL ou Auto (ALL), utilisez la formule suivante :

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

Pour les formules de table, le nombre de segments est basé sur le fait que la table possède ou non une clé de tri définie. Si une table Amazon Redshift a une clé de tri définie, la table comporte deux segments : un segment trié et un segment non trié. Si une table Amazon Redshift n'a pas de clé de tri, la table ne produit qu'un seul segment non trié.

Vous pouvez calculer le nombre de sections remplies à l'aide de la requête suivante :

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" ;

Exemple : six cluster dc2.large

Par exemple, un cluster de six dc2.large peut être créé avec quatre petites tables ayant la même structure et le même nombre de lignes. Si le cluster utilise trois styles de distribution différents et un style de distribution avec une clé de tri, alors différentes requêtes sont utilisées.

La requête suivante crée une table avec un style de distribution ALL (et une sortie de six sections remplies) :

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');

La requête suivante crée une table avec un style de distribution EVEN (et une sortie de six sections remplies) :

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');

La requête suivante crée une table avec une clé de distribution (et une sortie d'une section remplie) :

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');

La requête suivante crée une table avec une clé de distribution et une clé de tri (et une sortie de six sections remplies) :

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');

Calcul de la taille minimale de la table

Pour calculer la taille minimale de la table pour un style de distribution EVEN, utilisez la formule suivante :

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

Pour calculer la taille minimale de la table pour un style de distribution ALL, utilisez la formule suivante :

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

Pour calculer la taille minimale de la table pour un style de distribution KEY, utilisez la formule suivante :

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

Pour calculer la taille minimale de la table pour une distribution EVEN avec une clé de tri, utilisez la formule suivante :

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

Comme l'indiquent les calculs, avec un petit nombre de lignes insérées, la taille de votre table est plus grande que prévu. La taille de la table continue d'augmenter à mesure que le nombre de lignes sont insérées et le nombre de sections remplies augmente.

Lorsqu'un redimensionnement classique est effectué, le nombre de sections remplies augmente sans augmentation du volume de données pour la table. Par conséquent, la quantité d'espace libre après le redimensionnement n'augmente pas linéairement.