Por que uma tabela em um cluster do Amazon Redshift consome mais ou menos espaço de armazenamento em disco do que o esperado?
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
Vídeos relacionados
Conteúdo relevante
- AWS OFICIALAtualizada há 2 anos
- AWS OFICIALAtualizada há um ano
- AWS OFICIALAtualizada há um ano
- AWS OFICIALAtualizada há 2 anos