Exemples de distribution - 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.

Exemples de distribution

Les exemples suivants illustrent le type de distribution des données selon les options que vous définissez dans l’instruction CREATE TABLE.

Exemples de DISTKEY

Regardez le schéma de la table USERS dans la base de données TICKIT. USERID est défini comme la colonne SORTKEY et la colonne DISTKEY :

select "column", type, encoding, distkey, sortkey from pg_table_def where tablename = 'users'; column | type | encoding | distkey | sortkey ---------------+------------------------+----------+---------+--------- userid | integer | none | t | 1 username | character(8) | none | f | 0 firstname | character varying(30) | text32k | f | 0 ...

USERID est un bon choix pour la colonne de distribution de cette table. Si vous interrogez la vue système SVV_DISKUSAGE, vous pouvez voir que la table est distribuée de manière très uniforme. Les nombres de colonnes sont de base zéro, USERID est donc la colonne 0.

select slice, col, num_values as rows, minvalue, maxvalue from svv_diskusage where name='users' and col=0 and rows>0 order by slice, col; slice| col | rows | minvalue | maxvalue -----+-----+-------+----------+---------- 0 | 0 | 12496 | 4 | 49987 1 | 0 | 12498 | 1 | 49988 2 | 0 | 12497 | 2 | 49989 3 | 0 | 12499 | 3 | 49990 (4 rows)

La table contient 49 990 lignes. La colonne (num_values) des lignes affiche que chaque tranche contient à peu près le même nombre de lignes. Les colonnes minvalue et maxvalue affichent la plage de valeurs sur chaque tranche. Chaque tranche comprend la quasi-totalité de la plage de valeurs, il y a donc de fortes chances que chaque tranche participe à l’exécution d’une requête qui filtre une plage d’identifiants d’utilisateur.

Cet exemple illustre la distribution sur un petit système de test. Le nombre total de tranches est généralement beaucoup plus élevé.

Si vous utilisez habituellement la colonne STATE pour effectuer une jointure ou un regroupement, vous pouvez choisir de distribuer sur la colonne STATE. L’exemple suivant illustre un cas où vous créez une table avec les mêmes données que la table USERS mais où vous définissez la DISTKEY sur la colonne STATE. Dans ce cas, la distribution n’est pas aussi régulière. La tranche 0 (13 587 lignes) contient environ 30 % de lignes en plus que la tranche 3 (10 150 lignes). Dans une table beaucoup plus grande, ce degré d’asymétrie de la distribution peut avoir un impact négatif sur le traitement des requêtes.

create table userskey distkey(state) as select * from users; select slice, col, num_values as rows, minvalue, maxvalue from svv_diskusage where name = 'userskey' and col=0 and rows>0 order by slice, col; slice | col | rows | minvalue | maxvalue ------+-----+-------+----------+---------- 0 | 0 | 13587 | 5 | 49989 1 | 0 | 11245 | 2 | 49990 2 | 0 | 15008 | 1 | 49976 3 | 0 | 10150 | 4 | 49986 (4 rows)

Exemple de DISTSTYLE EVEN

Si vous créez une table avec les mêmes données que la table USERS, mais que vous définissez DISTSTYLE sur EVEN, les lignes sont toujours distribuées uniformément entre les tranches.

create table userseven diststyle even as select * from users; select slice, col, num_values as rows, minvalue, maxvalue from svv_diskusage where name = 'userseven' and col=0 and rows>0 order by slice, col; slice | col | rows | minvalue | maxvalue ------+-----+-------+----------+---------- 0 | 0 | 12497 | 4 | 49990 1 | 0 | 12498 | 8 | 49984 2 | 0 | 12498 | 2 | 49988 3 | 0 | 12497 | 1 | 49989 (4 rows)

Cependant, du fait que la distribution n’est pas basée sur une colonne spécifique, le traitement des requêtes peut être dégradé, surtout si la table est jointe à d’autres tables. L’absence de distribution sur une colonne de jointure influence souvent le type d’opération de jointure qui peut être effectué de manière efficace. Les jointures, les agrégations et les opérations de regroupement sont optimisées lorsque les deux tables sont distribuées et triées sur leurs colonnes de jointure respectives.

Exemple de DISTSTYLE ALL

Si vous créez une table avec les mêmes données que la table USERS, mais que vous définissez DISTSTYLE sur ALL, toutes les lignes sont distribuées à la première tranche de chaque nœud.

select slice, col, num_values as rows, minvalue, maxvalue from svv_diskusage where name = 'usersall' and col=0 and rows > 0 order by slice, col; slice | col | rows | minvalue | maxvalue ------+-----+-------+----------+---------- 0 | 0 | 49990 | 4 | 49990 2 | 0 | 49990 | 2 | 49990 (4 rows)