encodages de compression - Amazon Redshift

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

encodages de compression

Un encodage de compression spécifie le type de compression appliqué à une colonne de valeurs de données à mesure que les lignes sont ajoutées à une table.

ENCODEAUTOest la valeur par défaut pour les tables. Lorsqu'une table est définie sur ENCODEAUTO, Amazon Redshift gère automatiquement le codage de compression pour toutes les colonnes de la table. Pour plus d’informations, consultez CREATE TABLE et ALTER TABLE.

Toutefois, si vous spécifiez le codage de compression pour une colonne de la table, celle-ci n'est plus définie sur ENCODEAUTO. Amazon Redshift ne gère plus automatiquement le codage de compression pour toutes les colonnes de la table.

Lorsque vous utilisez CREATETABLE, ENCODE AUTO est désactivé lorsque vous spécifiez le codage de compression pour n'importe quelle colonne du tableau. Si ENCODE AUTO cette option est désactivée, Amazon Redshift attribue automatiquement un codage de compression aux colonnes pour lesquelles vous ne spécifiez aucun ENCODE type, comme suit :

  • La RAW compression est affectée aux colonnes définies comme clés de tri.

  • Les colonnes définies comme BOOLEANREAL, ou les types de DOUBLE PRECISION données sont RAW compressées.

  • Les colonnes définies comme des types de TIMESTAMPTZ données SMALLINT INTEGERBIGINT,DECIMAL,DATE,TIMESTAMP, ou sont soumises à une AZ64 compression.

  • La LZO compression est affectée aux colonnes définies CHAR ou aux types de VARCHAR données.

Vous pouvez modifier le codage d'une table après l'avoir créée en utilisant ALTERTABLE. Si vous désactivez ENCODE AUTO l'utilisation ALTERTABLE, Amazon Redshift ne gère plus automatiquement les codages de compression pour vos colonnes. Toutes les colonnes conserveront les types de codage de compression qu'elles utilisaient lorsque vous les avez désactivées, ENCODE AUTO jusqu'à ce que vous les modifiiez ou que vous les ENCODE AUTO réactiviez.

Amazon Redshift prend en charge les codages de compression suivants :

Raw

Le codage brut est le codage par défaut pour les colonnes désignées comme des clés de tri et les colonnes définies comme BOOLEAN REAL DOUBLE PRECISION des types de données. Avec l’encodage brut, les données sont stockées dans un format brut, non compressé.

AZ64

AZ64est un algorithme de codage par compression propriétaire conçu par Amazon pour atteindre un taux de compression élevé et améliorer le traitement des requêtes. À la base, l'AZ64algorithme compresse de petits groupes de valeurs de données et utilise une seule instruction, plusieurs instructions data (SIMD) pour le traitement en parallèle. AZ64À utiliser pour réaliser des économies de stockage importantes et des performances élevées pour les types de données numériques, de date et d'heure.

Vous pouvez l'utiliser AZ64 comme codage de compression lorsque vous définissez des colonnes à l'aide d'ALTERTABLEinstructions CREATE TABLE et contenant les types de données suivants :

  • SMALLINT

  • INTEGER

  • BIGINT

  • DECIMAL

  • DATE

  • TIMESTAMP

  • TIMESTAMPTZ

Byte-dictionary

Avec l’encodage par dictionnaire d’octets, un dictionnaire distinct de valeurs uniques est créé pour chaque bloc de valeurs de colonne sur le disque. (Un bloc de disque Amazon Redshift occupe 1 Mo.) Le dictionnaire contient jusqu’à 256 valeurs d’un octet qui sont stockées sous forme d’index pour les valeurs de données originales. Si plus de 256 valeurs sont stockées dans un seul bloc, les valeurs supplémentaires sont écrites dans le bloc dans un format brut, non compressé. Le processus se répète pour chaque bloc de disque.

Ce codage est très efficace pour les colonnes de chaînes à faible cardinalité. Cet encodage est optimal lorsque le domaine de données d’une colonne est inférieur à 256 valeurs uniques.

Pour les colonnes dont le type de données est codé (CHARetVARCHAR) sous forme de chaîneBYTEDICT, Amazon Redshift effectue des analyses vectorisées et des évaluations de prédicats qui s'appliquent directement aux données compressées. Ces scans utilisent des instructions uniques spécifiques au matériel et des instructions multiples data (SIMD) pour le traitement en parallèle. Cela permet d’accélérer considérablement l’analyse des colonnes de chaînes de caractères. Le codage par dictionnaire d'octets est particulièrement économe en espace si une VARCHAR colonneCHAR/contient de longues chaînes de caractères.

Supposons qu'une table comporte une COUNTRY colonne avec un type de données CHAR (30). Lorsque les données sont chargées, Amazon Redshift crée le dictionnaire et remplit la COUNTRY colonne avec la valeur d'index. Le dictionnaire contient les valeurs uniques indexées, et la table elle-même contient uniquement les sous-scripts d’un octet des valeurs correspondantes.

Note

Les espaces de fin sont stockés pour les colonnes de caractères de longueur fixe. Ainsi, dans une colonne CHAR (30), chaque valeur compressée permet d'économiser 29 octets de stockage lorsque vous utilisez le codage par dictionnaire d'octets.

Le tableau suivant représente le dictionnaire de la COUNTRY colonne.

Valeur de données unique Index du dictionnaire Taille (longueur fixe, 30 octets par valeur)
England 0 30
United States of America 1 30
Venezuela 2 30
Sri Lanka 3 30
Argentina 4 30
Japan 5 30
Total 180

Le tableau suivant représente les valeurs de la COUNTRY colonne.

Valeur de données d’origine Taille d’origine (longueur fixe, 30 octets par valeur) Valeur compressée (index) Nouvelle taille (octets)
England 30 0 1
England 30 0 1
United States of America 30 1 1
United States of America 30 1 1
Venezuela 30 2 1
Sri Lanka 30 3 1
Argentina 30 4 1
Japan 30 5 1
Sri Lanka 30 3 1
Argentina 30 4 1
Total 300 10

Dans cet exemple, la taille compressée totale est calculée comme suit : 6 entrées distinctes sont stockées dans le dictionnaire (6 * 30 = 180), et la table contient 10 valeurs compressées de 1 octet, soit un total de 190 octets.

Delta

Les encodages Delta sont très utiles pour les colonnes de date et d’heure.

L’encodage Delta compresse les données en enregistrant la différence entre les valeurs qui se suivent dans la colonne. Cette différence est enregistrée dans un dictionnaire distinct pour chaque bloc de valeurs de la colonne sur le disque. (Un bloc de disque Amazon Redshift occupe 1 Mo.) Par exemple, supposons que la colonne contienne 10 entiers dans l’ordre de 1 à 10. Les premiers sont stockés sous la forme d’un entier de 4 octets (plus un indicateur de 1 octet). Les neuf suivants sont chacun stockés sous forme d’octet avec la valeur 1, ce qui indique qu’il est supérieur à la valeur précédente.

L’encodage Delta se décline en deux variations :

  • DELTAenregistre les différences sous forme de valeurs de 1 octet (entiers de 8 bits)

  • DELTA32Kenregistre les différences sous forme de valeurs de 2 octets (entiers de 16 bits)

Si la plupart des valeurs de la colonne peuvent être comprimées en utilisant un seul octet, la variation d’un octet est très efficace. Cependant, si les deltas sont plus importants, cet encodage, dans le pire des cas, est un peu moins efficace que le stockage des données non compressées. Une logique similaire s’applique à la version de 16 bits.

Si la différence entre deux valeurs dépasse la plage de 1 octet (DELTA) ou de 2 octets (DELTA32K), la valeur d'origine complète est stockée, avec un indicateur de 1 octet en tête. La plage de 1 octet s’étend de -127 à 127, et la plage de 2 octets, de -32K à 32K.

Le tableau suivant présente le fonctionnement d’un encodage Delta pour une colonne numérique.

Valeur de données d’origine Taille d’origine (octets) Différence (delta) Valeur compressée Taille compressée (octets)
1 4 1 1 + 4 (indicateur + valeur réelle)
5 4 4 4 1
50 4 45 45 1
200 4 150 150 1 + 4 (indicateur + valeur réelle)
185 4 -15 -15 1
220 4 35 35 1
221 4 1 1 1
Totaux 28 15
LZO

LZOle codage fournit un taux de compression très élevé avec de bonnes performances. LZOle codage fonctionne particulièrement bien pour CHAR les VARCHAR colonnes contenant de très longues chaînes de caractères. Ils sont particulièrement adaptés aux textes de forme libre, tels que les descriptions de produits, les commentaires des utilisateurs ou les JSON chaînes de caractères.

Mostly

Les encodages Mostly sont utiles lorsque le type de données d’une colonne est plus volumineux que la plupart des valeurs stockées le nécessitent. En spécifiant un encodage Mostly pour ce type de colonne, vous pouvez compresser la majorité des valeurs de la colonne dans une taille de stockage standard inférieure. Les autres valeurs qui ne peuvent pas être compressées sont stockées dans leur format brut. Par exemple, vous pouvez compresser une colonne 16 bits, telle qu'une INT2 colonne, en stockage 8 bits.

En général, les encodages Mostly fonctionnent avec les types de données suivants :

  • SMALLINT/INT2(16 bits)

  • INTEGER/INT(32 bits)

  • BIGINT/INT8(64 bits)

  • DECIMAL/NUMERIC(64 bits)

Choisissez la variation appropriée de l’encodage Mostly en fonction de la taille du type de données de la colonne. Par exemple, appliquez MOSTLY8 à une colonne définie comme une colonne entière de 16 bits. L'application MOSTLY16 à une colonne avec un type de données 16 bits ou MOSTLY32 à une colonne avec un type de données 32 bits n'est pas autorisée.

Les encodages Mostly peuvent être moins efficaces qu’aucune compression du tout, si bon nombre des valeurs de la colonne ne peuvent pas être compressées. Avant d’appliquer l’un de ces encodages à une colonne, effectuez une vérification. La plupart des valeurs que vous allez charger maintenant (et que vous êtes susceptible de charger à l’avenir) devraient se situer dans les plages indiquées dans le tableau suivant.

Encodage Taille de stockage compressée Plage de valeurs qui peuvent être compressées (les valeurs situées en dehors de la plage sont stockées dans un format brut)
MOSTLY8 1 octet (8 bits) -128 à 127
MOSTLY16 2 octets (16 bits) -32768 à 32767
MOSTLY32 4 octets (32 bits) -2147483648 à +2147483647
Note

Pour les valeurs décimales, ignorez la virgule pour déterminer si la valeur correspond à la plage. Par exemple, 1 234,56 est traité comme 123 456 et peut être compressé dans une colonne. MOSTLY32

Par exemple, la VENUEID colonne de la VENUE table est définie comme une colonne d'entiers bruts, ce qui signifie que ses valeurs consomment 4 octets de stockage. Toutefois, la plage de valeurs actuelle de la colonne s’étend de 0 à 309. Par conséquent, la recréation et le rechargement de cette table avec le MOSTLY16 codage pour VENUEID réduiraient le stockage de chaque valeur de cette colonne à 2 octets.

Si les VENUEID valeurs référencées dans une autre table étaient pour la plupart comprises entre 0 et 127, il peut être judicieux de coder cette colonne de clé étrangère en tant que. MOSTLY8 Avant de faire votre choix, exécutez plusieurs requêtes sur les données de la table de référencement pour savoir si les valeurs se situent principalement dans une plage de 8, 16 ou 32 bits

Le tableau suivant indique les tailles compressées pour des valeurs numériques spécifiques lorsque les MOSTLY32 codages MOSTLY8MOSTLY16, et sont utilisés :

Valeur d’origine Original INT ou BIGINT taille (octets) MOSTLY8taille compressée (octets) MOSTLY16taille compressée (octets) MOSTLY32taille compressée (octets)
1 4 1 2 4
10 4 1 2 4
100 4 1 2 4
1 000 4 Identique à la taille des données brutes 2 4
10 000 4 2 4
20 000 4 2 4
40 000 8 Identique à la taille des données brutes 4
100 000 8 4
2 000 000 000 8 4
Run length

L’encodage de la longueur d’exécution remplace une valeur qui est répétée de façon consécutive par un jeton composé de la valeur et d’un calcul du nombre d’occurrences consécutives (la longueur de l’exécution). Un dictionnaire distinct de valeurs uniques est créé pour chaque bloc de valeurs de la colonne sur le disque. (Un bloc de disque Amazon Redshift occupe 1 Mo.) Cet encodage est mieux adapté à une table dans laquelle les valeurs de données sont souvent répétées de façon consécutive, par exemple, lorsque la table est triée en fonction de ces valeurs.

Supposons, par exemple, qu'une colonne d'une table de grandes dimensions possède un domaine relativement petit, tel qu'une COLOR colonne contenant moins de 10 valeurs possibles. Ces valeurs sont susceptibles de tomber en longues séquences dans le tableau, même si les données ne sont pas triées.

Nous ne recommandons pas d’appliquer l’encodage de la longueur d’exécution sur une colonne désignée comme clé de tri. Les analyses restreintes à la plage sont plus performantes lorsque les blocs contiennent un nombre de lignes similaire. Si les colonnes de clés sont beaucoup plus compressées que les autres colonnes de la même requête, des analyses à plage restreintes peuvent avoir de mauvaises performances.

Le tableau suivant utilise l'exemple de COLOR colonne pour montrer le fonctionnement du codage de la longueur de série.

Valeur de données d’origine Taille d’origine (octets) Valeur compressée (jeton) Taille compressée (octets)
Blue 4 {2,bleu} 5
Blue 4 0
Green 5 {3,vert} 6
Green 5 0
Green 5 0
Blue 4 {1,Blue} 5
Yellow 6 {4,Yellow} 7
Yellow 6 0
Yellow 6 0
Yellow 6 0
Total 51 23
Text255 and Text32k

Les codages Text255 et Text32k sont utiles pour compresser les VARCHAR colonnes dans lesquelles les mêmes mots se reproduisent souvent. Un dictionnaire distinct de mots uniques est créé pour chaque bloc de valeurs de la colonne sur le disque. (Un bloc de disque Amazon Redshift occupe 1 Mo.) Le dictionnaire contient les 245 premiers mots uniques de la colonne. Ces termes sont remplacés sur le disque par une valeur d’index d’un octet représentant l’une des 245 valeurs, et tous les mots qui ne sont pas représentées dans le dictionnaire sont stockés sous une forme décompressée. Le processus se répète pour chaque bloc de disque de 1 Mo. Si les mots indexés apparaissent fréquemment dans la colonne, celle-ci présente un taux de compression élevé.

Pour l’encodage text32k, le principe est le même, mais le dictionnaire de chaque bloc ne capture pas un nombre de mots spécifique. A la place, le dictionnaire indexe chaque mot unique qu’il trouve jusqu’à ce que les entrées combinées atteignent une longueur de 32K, moins le dépassement. Les valeurs d’index sont stockées dans deux octets.

Par exemple, considérez la VENUENAME colonne du VENUE tableau. Les mots comme Arena, Center et Theatre sont récurrents dans cette colonne et sont susceptibles de figurer parmi les 245 premiers mots rencontrés dans chaque bloc si la compression text255 est appliquée. Si c’est le cas, cette colonne bénéficie d’une compression. En effet, chaque fois que ces mots apparaissent, ils n’occupent qu’un seul octet de stockage (au lieu de 5, 6 ou 7 octets, respectivement).

ZSTD

Le codage Zstandard (ZSTD) fournit un taux de compression élevé avec de très bonnes performances sur divers ensembles de données. ZSTDfonctionne particulièrement bien avec CHAR les VARCHAR colonnes qui stockent un large éventail de chaînes longues et courtes, telles que les descriptions de produits, les commentaires des utilisateurs, les journaux et les JSON chaînes. Lorsque certains algorithmes, tels que le codage Delta ou le codage principal, peuvent potentiellement utiliser plus d'espace de stockage que l'absence de compression, il ZSTD est peu probable qu'ils augmentent l'utilisation du disque.

ZSTDprend en charge SMALLINTINTEGER,BIGINT,DECIMAL,REAL,, DOUBLEPRECISION,BOOLEAN,CHAR,VARCHAR,, DATETIMESTAMP, et les types de TIMESTAMPTZ données.

Le tableau suivant identifie le codage de compression pris en charge et les types de données qui prennent en charge l’encodage.

Type d’encodage Mot clé dans CREATE TABLE et ALTER TABLE Types de données
Brut (aucune compression) RAW Tous
AZ64 AZ64 SMALLINT, INTEGER, BIGINT, DECIMAL, DATE, TIMESTAMP, TIMESTAMPTZ
Dictionnaire d’octets BYTEDICT SMALLINT, INTEGER, BIGINT, DECIMAL, REAL, DOUBLE PRECISION, CHAR, VARCHAR, DATE, TIMESTAMP, TIMESTAMPTZ
Delta

DELTA

DELTA32K

SMALLINT, INT, BIGINT, DATE, TIMESTAMP, DECIMAL

INT, BIGINT, DATE, TIMESTAMP, DECIMAL

LZO LZO SMALLINT, INTEGER, BIGINT, DECIMAL, CHAR, VARCHAR, DATE, TIMESTAMP, TIMESTAMPTZ, SUPER
Mostlyn

MOSTLY8

MOSTLY16

MOSTLY32

SMALLINT, INT, BIGINT, DECIMAL

INT, BIGINT, DECIMAL

BIGINT, DECIMAL

Run-length RUNLENGTH SMALLINT, INTEGER, BIGINT, DECIMAL, REAL, DOUBLE PRECISION, BOOLEAN, CHAR, VARCHAR, DATE, TIMESTAMP, TIMESTAMPTZ
Texte

TEXT255

TEXT32K

VARCHARuniquement

VARCHARuniquement

Zstandard ZSTD SMALLINT, INTEGER, BIGINT, DECIMAL, REAL, DOUBLE PRECISION, BOOLEAN, CHAR, VARCHAR, DATE, TIMESTAMP, TIMESTAMPTZ, SUPER