Redshift – Des idées d’optimisation

Redshift est une base de données analytique distribuée, hébergée et gérée par Amazon, basée sur PostgreSQL 8.0.2.
Son stockage orienté colonnes lui permet une forte compression des données et une utilisation optimale des I/O, c’est idéal pour la lecture de masse et l’agrégation.

Mon expérience se base sur un cluster de 8 noeuds disposant chacun de 2 To d’espace disque et 32 Go de RAM, pouvant être amené à évoluer en fonction des besoins, et c’est là qu’opère la magie du service géré par Amazon.

Pour ajouter un ou plusieurs noeud(s) avec une configuration équivalente aux noeud en place, cela se fait en quelques clics et en live. Le transfert de données à ce nouveau noeud s’opère automatiquement. Pour configurer un nouveau type de noeud (pour modifier le moteur de stockage par exemple), on est contraint de passer le cluster en maintenance pour quelques heures, le temps de la copie des données d’un cluster à un autre.

Je vous partage ici, les premières optimisations que l’on peut apporter à un cluster Redshift, en terme de modélisation.

Le mode de stockage de Redshift, rend obsolètes certaines règles que l’on peut se fixer avec un SGBD relationnel classique.
Par exemple, ajouter foison de colonnes à faible taux de remplissage dans une table était peu recommandé, pour autant, cela peut cependant avoir un fort intérêt analytique.

Avec Redshift, il est possible, sans pénaliser le moteur de stockage ou les performances, créer et alimenter des tables à forte volumétrie et contenant de nombreuses colonnes.
Le vide importe peu, chaque colonne peut être considérée comme ‘indexée’ et n’est chargée que si elle est appelée (à l’inverse des SGBD relationnels qui pour chaque enregistrement retourné considèrera toute la ligne).

Malgré tout, il peut y avoir des optimisations à apporter, le fait que la donnée soit distribuée sur un cluster a forcément des impacts si la distribution est trop aléatoire.
Deux options clé sont donc à aborder : sort key et distribution style.

Les sort keys

Les sort keys permettent d’ordonner les données d’une table au sein du cluster afin d’améliorer les performances des requêtes de types range, agrégations, tris et les window functions effectuées sur cette clé.
Cela évite de parcourir toute une table inutilement.

Elles sont spécifiées à la création de la table, et si elles sont multiples, deux types peuvent être utilisés :

CREATE TABLE schema1.s1_website_audience
( /**
...
**/ )
INTERLEAVED SORTKEY (page_id, day_id);

Le distribution style

Le distribution style est à définir à la création sur chaque table pour définir la répartition des lignes sur le cluster.
Trois modes sont disponibles :

Même si l’utilisation de ces deux paramètres peut s’avérer contraignante en terme de maintenance, elle apporte un véritable gain en terme de performance et rendent les plans de requêtes beaucoup plus cohérents.