Le volume par défaut d'espace disque alloué à deux tables qui se trouvent sur des clusters Amazon Redshift distincts peut varier de manière significative, même lorsque celles-ci sont créées avec des instructions DDL identiques et qu'elles contiennent le même nombre de lignes. Dans ce scénario, les différences notées au niveau de l'espace de stockage disque alloué à chaque table dépend essentiellement du nombre de sections de chaque cluster Redshift et du nombre de segments utilisés par chaque table.

Pour allouer l'espace de stockage disque pour les tables, Amazon Redshift calcule la formule « Taille de table minimum » 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.

Sachant que les deux tables créées dans Amazon Redshift :

  • Reposent sur des instructions DDL identiques
  • Contiennent le même nombre de lignes
  • Se trouvent sur différents nœuds de cluster
  • N'ont pas été modifiées manuellement

Les différences d'allocation de l'espace de stockage disque pour ces tables dépendent des facteurs suivants :

  • Nombre de sections remplies et allouées à chaque nœud de cluster (pour les tables créées avec le style de distribution KEY ou EVEN).
  • Nombre de nœuds de cluster Redshift utilisés par la table (pour les tables créées avec le style de distribution ALL).
  • Nombre de segments utilisés par chaque table, indépendamment de leur style de distribution.

Remarque : pour les besoins de cet article, un « segment de table » désigne une structure de données créée pour une table, par opposition à un segment d'exécution de requête, comme décrit à l'étape 5 de la section Workflow d'exécution et de planification de requête. Amazon Redshift est un système de gestion de base de données (SGBD) en colonnes. Les tables sont créées sous forme de segments de colonnes de données, au lieu de lignes. Lorsque des données sont ajoutées à une table après sa création dans un SGBD en colonnes, celles-ci sont gérées dans un segment de table séparé qui contient les données non triées. Autrement dit, les données ne sont pas insérées dans le segment de clé de tri d'origine tant qu'une opération VACUUM n'a pas été effectuée. La variable number_of_table_segments (nombre_de_segments_de_table) renvoie l'une des trois valeurs entières qui représentent le nombre de segments de table à allouer pour les tables Redshift :

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

1 : une table avec une clé de tri a été chargée une seule fois et n'a jamais été vidée OU une table sans clé de tri a été chargée une ou plusieurs fois. Allouez l'espace disque pour un seul segment de table.

2 : une table avec une clé de tri a été chargée une seule fois et n'a jamais été vidée OU a été chargée plusieurs fois. Allouez l'espace disque pour deux segments de table.

Exemple de calcul de la taille de table minimum :

Avec une table de 125 colonnes utilisateur dans un seul segment de clé de tri au niveau d'un cluster avec 16 sections remplies, le taille de table minimum est calculée comme suit :

1 Mo * (125 + 3) * 16 * 1 = 2 048 Mo

Maintenant, avec une table créée avec une instruction DDL identique, mais qui :

  • Stocke les données dans un segment de clé trié et un segment de clé non trié
  • Se trouve sur un cluster avec 64 sections remplies

Le calcul de la taille de table minimum dicte que la table utilise beaucoup plus d'espace disque :

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

Remarque : il se peut que le calcul de la taille de table minimum renvoie un résultat légèrement différent du résultat prévu juste après la réalisation d'une opération VACUUM avec les paramètres SORT ONLY ou DELETE ONLY. Cela est dû au fait que l'opération VACUUM ajoute des blocs pour le traitement des données dans le cadre des opérations de tri et de suppression. Pour plus d'informations, consultez la section Notes d'utilisation.

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;

 

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(stp.pop_slices*(colenc.cols+3))

                   WHEN substring("diststyle",1,3)='KEY'

                      THEN(stp.pop_slices*(colenc.cols+3))

                   WHEN"diststyle"='ALL'THEN(cluster_info.node_count*(colenc.cols+3))

           FIN

           ELSE CASE

                    WHEN"diststyle"='EVEN'THEN(stp.pop_slices*(colenc.cols+3)*2)

                   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)

           FIN

       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 la plus adaptée à votre scénario d'utilisation, consultez les informations des sections A propos des clusters et des nœuds et Architecture système d'entrepôt de données.

Amazon Redshift, espace disque, allocation, taille de table minimum, sections de stockage, cluster, nœud de calcul, DC1.L, DC1.8XL, DS2.XL, DS2.8XL, distribution des 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