Une table dans un cluster Amazon Redshift utilise l'espace de stockage de disque différemment que prévu. Comment sont calculés l'espace de stockage sur disque et la taille de la table dans Amazon Redshift ?

Le volume d'espace disque alloué à deux tables qui se trouvent sur des clusters Amazon Redshift distincts peut varier de manière significative, même si celles-ci sont créées avec des instructions DDL identiques et qu'elles contiennent le même nombre de lignes. Dans le scénario suivant, la différence d'espace de stockage disque consommée par chaque table est déterminée par :

  • Le nombre de tranches réparties sur chaque cluster Amazon Redshift
  • Le nombre de segments de table utilisés par chaque table

L'espace disque minimal correspond au plus petit volume de données qu'une table puisse avoir sur un cluster Amazon Redshift. Vous pouvez vérifier la taille minimale de la table lors de l'analyse de l'utilisation du stockage en cluster ou lors du redimensionnement d'un cluster Amazon Redshift. Vous pouvez calculer l'espace disque minimum en utilisant la formule suivante :

  • Pour les tables créées avec le style de distribution KEY ou EVEN :
    Taille de table minimum = taille_bloc (1Mo) * (nombre_de_colonnes_utilisateur + 3 colonnes système) * nombre_de_sections_remplies * nombre_de_segments_de_table.
  • Pour les tables créées avec le style de distribution ALL :
    Taille de table minimum = taille_bloc (1Mo) * (nombre_de_colonnes_utilisateur + 3 colonnes système) * nombre_de_noeuds_de_cluster * nombre_de_segments_de_table.

Si deux tables Amazon Redshift partagent les attributs suivants :

  • Créées avec des instructions DDL identiques
  • Contiennent le même nombre de lignes
  • N'ont pas été modifiées manuellement

L'allocation d'espace de stockage de disque de table peut alors varier en fonction de :

  • Le nombre de tranches de cluster remplies par la table, pour le style EVEN et la distribution de clé
  • Le nombre de nœuds dans le cluster pour TOUTES les tranches distribuées
  • Le nombre de segments dans une table

Si une table Amazon Redshift a une clé de tri, la table comporte deux segments : un segment trié et un segment non trié. Si une table Amazon Redshift ne possède pas de clé de tri, toutes les données ne sont pas triées et, par conséquent, la table contient un segment non trié.

Lorsque des données sont ajoutées à une table existante avec une clé de tri, les nouvelles données sont conservées dans un segment distinct contenant des données non triées. Les données ne sont pas insérées dans le segment de clé trié original tant qu'une opération VACUUM n'est pas effectuée. Pour plus d'informations, voir Gestion du volume des lignes fusionnées.

Remarque : l'opération VACUUM fusionne les données avec les données triées. Cependant, la table aura toujours un segment non trié pour les charges futures.

La variable number_of_table_segments renvoie l'une des trois valeurs qui représentent le nombre de segments de table à allouer pour les tables Amazon Redshift :

    0 : aucune table n'a été chargée. Allouez l'espace disque pour zéro segment de table.

    1 : une table sans clé de tri a été chargée une ou plusieurs fois.

    2: une table avec une clé de tri a été chargée une ou plusieurs fois.

Exemple de calcul de la taille de table minimum :

Si une table contient 125 colonnes utilisateur avec des clés de tri sur un cluster de 16 tranches, la plus petite taille que la table peut remplir pour les 16 tranches est calculée comme suit :

1 Mo * (125 + 3) * 16 * 2 = 4 096 Mo

Si une table est créée avec une instruction DDL et que la table réside sur un cluster en deux tranches qui remplit les deux tranches, le calcul de la taille minimale de la table indique que la table utilise beaucoup moins de stockage sur disque :

1 Mo * (125 + 3) * 2 * 2 = 512 Mo

Si une table est créée avec une instruction DDL identique et que la table réside sur un cluster avec 64 tranches remplies, le calcul de la taille de table minimale suivante indique que la table utilise beaucoup plus de stockage sur disque :

1 Mo * (125 + 3) * 64 * 2 = 16 384 Mo

Sur la base de l'exemple de taille de table minimale, la taille de la table peut augmenter ou diminuer en fonction du nombre de tranches remplies sur le cluster. 

1. Utilisez la requête ci-dessous pour déterminer le volume d'espace disque alloué à une table dans un cluster Amazon Redshift :

SELECT ti.database,
      ti.schema||'.'||ti."table"AS tablename,
      ti.size
FROM svv_table_info ti;

2. Exécutez la requête suivante pour calculer la taille minimum d'une table :

WITH 
tbl_ids AS
(SELECT DISTINCT oid
FROM pg_class c
WHERE relowner>1
AND relkind='r'),
stp AS
(SELECT id,sum(ROWS)sum_r,sum(sorted_rows)sum_sr,min(ROWS)min_r,
max(ROWS)max_r,nvl(count(DISTINCT slice),0)pop_slices
FROM stv_tbl_perm
WHERE id IN (SELECT oid FROM tbl_ids)
AND slice<6400
GROUP BY id),
colenc AS
(SELECT attrelid,sum(CASE WHEN a.attencodingtype=0 THEN 0 ELSE 1 END)
AS encoded_cols,count(*)AS cols
FROM pg_attribute a
WHERE a.attrelid IN (SELECT oid FROM tbl_ids)
AND a.attnum>0
GROUP BY a.attrelid),
cluster_info AS
(SELECT COUNT(DISTINCT node) node_count
FROM stv_slices)
SELECT ti.database,
ti.schema||'.'||ti."table"AS tablename,
ti.diststyle,
ti.sortkey1,
ti.size current_size,
nvl(CASE
WHEN stp.sum_r=stp.sum_sr
OR stp.sum_sr=0 THEN CASE
WHEN"diststyle"='EVEN' THEN
CASE
WHEN ti.sortkey1 != '' THEN (stp.pop_slices*(colenc.cols+3)*2)
ELSE (stp.pop_slices*(colenc.cols+3))
END
WHEN substring("diststyle",1,3)='KEY' THEN
CASE
WHEN ti.sortkey1 != '' THEN (stp.pop_slices*(colenc.cols+3)*2)
ELSE (stp.pop_slices*(colenc.cols+3))
END
WHEN"diststyle"='ALL' THEN
CASE
WHEN ti.sortkey1 != '' THEN cluster_info.node_count*(colenc.cols+3)*2
ELSE cluster_info.node_count*(colenc.cols+3)
END
END
ELSE CASE
WHEN"diststyle"='EVEN'THEN(stp.pop_slices*2*(colenc.cols+3))
WHEN substring("diststyle",1,3)='KEY'
THEN(stp.pop_slices*(colenc.cols+3)*2)
WHEN"diststyle"='ALL'
THEN(cluster_info.node_count*(colenc.cols+3)*2)
END
END,0) AS minimum_size
FROM svv_table_info ti
LEFT JOIN stp ON stp.id=ti.table_id
LEFT JOIN colenc ON colenc.attrelid=ti.table_id
CROSS JOIN cluster_info
WHERE ti.schema NOT IN('pg_internal')
ORDER BY ti.size DESC;

Pour déterminer la configuration de cluster optimale pour votre scénario d'utilisation, consultez les rubriques Clusters et nœuds dans Amazon Redshift et Architecture du système d'entrepôt de données.


Cette page vous a-t-elle été utile ? Oui | Non

Retour au Centre de connaissances AWS Support

Vous avez besoin d'aide ? Consultez le site du Centre AWS Support

Date de publication : 15/04/2016

Date de mise à jour : 06/07/2018