Por que uma tabela em um cluster do Amazon Redshift consome mais ou menos espaço de armazenamento em disco do que o esperado?

4 minuto de leitura
0

Uma tabela está ocupando mais espaço em disco do que o esperado ou uma porcentagem do espaço livre em disco não aumentou após meu redimensionamento clássico. Como o Amazon Redshift calcula o armazenamento em disco e o tamanho da tabela?

Resolução

Verificar o tamanho mínimo da tabela

O tamanho mínimo da tabela é a menor área ocupada por uma tabela em um cluster do Amazon Redshift. Você pode verificar o tamanho mínimo da tabela ao analisar o uso do armazenamento do cluster ou ao redimensionar um cluster do Amazon Redshift.

Para tabelas criadas usando o estilo de distribuição KEY, EVEN ou Auto (EVEN), use a seguinte fórmula:

Minimum table size = block_size (1 MB) *
(number_of_user_columns + 3 system columns) * number_of_populated_slices * number_of_table_segments

Para tabelas criadas usando o estilo de distribuição ALL ou Auto (ALL), use a seguinte fórmula:

Minimum table size = block_size (1 MB) *
(number_of_user_columns + 3 system columns) * number_of_cluster_nodes * number_of_table_segments

Para as fórmulas de tabela, o número de segmentos é baseado no fato de a tabela ter uma chave de classificação definida. Se uma tabela do Amazon Redshift tiver uma chave de classificação definida, essa tabela terá dois segmentos: um classificado e um não classificado. Se uma tabela do Amazon Redshift não tiver chave de classificação, ela produzirá somente um segmento não classificado.

Você pode calcular o número de fatias preenchidas usando a seguinte consulta:

select count(distinct a.slice) as
number_of_populated_slices, b."table" from stv_blocklist a,
svv_table_info b where a.tbl = b.table_id group by b."table" ;

Exemplo: seis clusters dc2.large

Por exemplo, um cluster com seis dc2.large pode ser criado com quatro tabelas pequenas da mesma estrutura e número de linhas. Se o cluster usar três estilos de distribuição diferentes e um estilo de distribuição com uma chave de classificação, consultas diferentes serão usadas.

A consulta a seguir cria uma tabela com um estilo de distribuição ALL (e uma saída de seis fatias preenchidas):

create table testsize_all (a varchar(100),b varchar(100), c
varchar(100)) diststyle all;
insert into testsize_all values
('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c');

A consulta a seguir cria uma tabela com um estilo de distribuição EVEN (e uma saída de seis fatias preenchidas):

create table testsize_even (a varchar(100),b varchar(100), c
varchar(100)) diststyle even;
insert into testsize_even values
('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c');

A consulta a seguir cria uma tabela com uma chave de distribuição (e uma saída de uma fatia preenchida):

create table testsize_key (a varchar(100),b varchar(100), c
varchar(100)) distkey (a);
insert into testsize_key values
('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c');

A consulta a seguir cria uma tabela com uma chave de distribuição e uma chave de classificação (e uma saída de seis fatias preenchidas):

create table testsize_sort_even (a varchar(100),b
varchar(100), c varchar(100) ) diststyle even sortkey (a);
insert into testsize_sort_even values
('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c');

Calcular o tamanho mínimo da tabela

Para calcular o tamanho mínimo da tabela para um estilo de distribuição EVEN, use a seguinte fórmula:

Minimum table size = block_size (1 MB) *
(number_of_user_columns + 3 system columns) * number_of_populated_slices *
number_of_table_segments
1MB * (3+3) * 6 *1 = 36MB

Para calcular o tamanho mínimo da tabela para um estilo de distribuição ALL, use a seguinte fórmula:

Minimum table size = block_size (1 MB) *
(number_of_user_columns + 3 system columns) * number_of_cluster_nodes *
number_of_table_segments
1MB * (3+3) * 6 *1 = 36 MB

Para calcular o tamanho mínimo da tabela para um estilo de distribuição KEY, use a seguinte fórmula:

Minimum table size = block_size (1 MB) * (number_of_user_columns
+ 3 system columns) * number_of_populated_slices * number_of_table_segments
1MB * (3+3) * 1 *1 = 6MB

Para calcular o tamanho mínimo da tabela para uma distribuição uniforme com uma chave de classificação, use a seguinte fórmula:

Minimum table size = block_size (1 MB) *
(number_of_user_columns + 3 system columns) * number_of_populated_slices *
number_of_table_segments
1MB * (3+3) * 6 *2 = 72MB

Conforme os cálculos indicam, com um pequeno número de linhas inseridas, o tamanho da tabela é maior do que o esperado. O tamanho da tabela continua crescendo à medida que o número de linhas é inserido e o número de fatias preenchidas aumenta.

Quando um redimensionamento clássico é executado, o número de fatias preenchidas aumenta sem um aumento no volume de dados da tabela. Como resultado, a quantidade de espaço livre após o redimensionamento não aumenta linearmente.


Informações relacionadas

Práticas recomendadas do Amazon Redshift para criar tabelas

Trabalhar com a otimização automática de tabelas

Armazenamento colunar

Escolha a melhor chave de classificação

Planejamento de consulta e fluxo de trabalho de execução

AWS OFICIAL
AWS OFICIALAtualizada há 2 anos