Identificar tabelas com desvio de dados ou linhas não classificadas
A seguinte consulta identifica as tabelas que possuem uma distribuição desigual de dados (desvio de dados) ou uma porcentagem alta de linhas não classificadas.
Um valor skew
baixo indica que os dados daquela tabela estão distribuídos adequadamente. Se uma tabela tem um valor skew
de 4,00 ou mais, considere modificar seu estilo de distribuição de dados. Para ter mais informações, consulte Distribuição de dados pouco satisfatória.
Se uma tabela tem um valor pct_unsorted
maior que 20 por cento, considere executar o comando VACUUM. Para ter mais informações, consulte Linhas não classificadas ou mal classificadas.
Você também deve revisar os valores mbytes
e pct_of_total
de cada tabela. Essas colunas identificam o tamanho da tabela e a porcentagem de espaço bruto em disco que a tabela utiliza. O espaço em disco bruto inclui o espaço reservado pelo Amazon Redshift para uso interno, portanto, é maior do que a capacidade nominal do disco, que é a quantidade de espaço em disco disponível para o usuário. Use essas informações para verificar se você tem espaço livre em disco igual a pelo menos 2,5 vezes o tamanho de sua maior tabela. Ter esse espaço disponível permite que o sistema grave resultados intermediários no disco ao processar consultas complexas.
select trim(pgn.nspname) as schema, trim(a.name) as table, id as tableid, decode(pgc.reldiststyle,0, 'even',1,det.distkey ,8,'all') as distkey, dist_ratio.ratio::decimal(10,4) as skew, det.head_sort as "sortkey", det.n_sortkeys as "#sks", b.mbytes, decode(b.mbytes,0,0,((b.mbytes/part.total::decimal)*100)::decimal(5,2)) as pct_of_total, decode(det.max_enc,0,'n','y') as enc, a.rows, decode( det.n_sortkeys, 0, null, a.unsorted_rows ) as unsorted_rows , decode( det.n_sortkeys, 0, null, decode( a.rows,0,0, (a.unsorted_rows::decimal(32)/a.rows)*100) )::decimal(5,2) as pct_unsorted from (select db_id, id, name, sum(rows) as rows, sum(rows)-sum(sorted_rows) as unsorted_rows from stv_tbl_perm a group by db_id, id, name) as a join pg_class as pgc on pgc.oid = a.id join pg_namespace as pgn on pgn.oid = pgc.relnamespace left outer join (select tbl, count(*) as mbytes from stv_blocklist group by tbl) b on a.id=b.tbl inner join (select attrelid, min(case attisdistkey when 't' then attname else null end) as "distkey", min(case attsortkeyord when 1 then attname else null end ) as head_sort , max(attsortkeyord) as n_sortkeys, max(attencodingtype) as max_enc from pg_attribute group by 1) as det on det.attrelid = a.id inner join ( select tbl, max(mbytes)::decimal(32)/min(mbytes) as ratio from (select tbl, trim(name) as name, slice, count(*) as mbytes from svv_diskusage group by tbl, name, slice ) group by tbl, name ) as dist_ratio on a.id = dist_ratio.tbl join ( select sum(capacity) as total from stv_partitions where part_begin=0 ) as part on 1=1 where mbytes is not null order by mbytes desc;