Exemplos de distribuição - Amazon Redshift

Exemplos de distribuição

Os seguintes exemplos mostram como os dados são distribuídos de acordo com as opções que você define na instrução CREATE TABLE.

Exemplos de DISTKEY

Observe o esquema da tabela USERS no banco de dados TICKIT. USERID é definida como a coluna SORTKEY e a coluna 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 é uma boa escolha para a coluna de distribuição dessa tabela. Se você consultar a exibição de sistema SVV_DISKUSAGE, verá que a tabela é distribuída de forma bastante uniforme. Os números de coluna são baseados em zero, portanto USERID é a coluna 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)

A tabela contém 49.990 linhas. As coluna de linhas (num_values) mostra que cada fatia contém aproximadamente o mesmo número de linhas. As colunas minvalue e maxvalue exibem o intervalo de valores em cada fatia. Cada fatia inclui quase todo o intervalo de valores, portanto, há uma boa chance de que cada fatia participe da execução de uma consulta que filtra uma variedade de IDs de usuário.

Este exemplo demonstra a distribuição em um pequeno sistema de teste. O número total de fatias é geralmente muito maior.

Se você normalmente realiza junções ou agrupamentos usando a coluna STATE, pode optar por distribuir na coluna STATE. O exemplo a seguir mostra um caso em que você cria uma nova tabela com os mesmos dados da tabela USERS, mas define DISTKEY para a coluna STATE. Neste caso, a distribuição não é igual. A fatia 0 (13.587 linhas) contém aproximadamente 30 por cento mais linhas do que a fatia 3 (10.150 linhas). Em uma tabela muito maior, essa quantidade de distorção de distribuição pode ter um impacto adverso no processamento de consultas.

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)

Exemplo de DISTSTYLE EVEN

Se você criar uma nova tabela com os mesmos dados da tabela USERS, mas definir DISTSTYLE como EVEN, as linhas sempre serão distribuídas uniformemente ao longo das fatias.

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)

Entretanto, como a distribuição não é baseada em uma coluna específica, o processamento da consulta pode ser degradado, especialmente se a tabela estiver associada à outras tabelas. A falta de distribuição em uma coluna de junção frequentemente influencia o tipo de operação de junção que pode ser executada eficientemente. Operações de junção, agregação e agrupamento são otimizadas quando ambas as tabelas são distribuídas e classificadas em suas respectivas colunas de junção.

Exemplo de DISTSTYLE ALL

Se você criar uma nova tabela com os mesmos dados da tabela USERS, mas definir DISTSTYLE como ALL, todas as linhas serão distribuídas para a primeira fatia de cada nó.

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)