Em 21/02/2014 12:48, Danilo Silva escreveu:
Pessoal,

Utilizo postgresql 9.1.9 em servidor debian.

Tenho uma tabela (principal tabela do banco de dados) que está com 18
milhões de registros e ocupando 21 GB de espaço.

Essa tabela é de histórico de leituras, portando muito utilizanda, tanto
para select quanto para inserts e updates.

Para ter um melhor desempenho, tenho duas opções:

1º Deletar registros mais antigos, algo em torno de 10 milhões de registros;
2º Particionar a tabela;

Penso em utilizar a 2ª opção visto ter acesso aos dados sem precisar
modificar a aplicação (que é para ambiente web).

Para a 2º opção o que vocês recomendam? Sei dos procedimentos para
particionar tabelas (criar as tabelas filhas, criar as triggers, etc),
mas a minha dúvida está na questão que a tabela já tem dados, como
proceder neste caso, visto que a tabela não é pequena?

[]s
Danilo


_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Olá Danilo.

Eu também te recomendaria a 2ª opção, para que não tenhas que excluir informações do seu banco que podem ser necessárias no futuro.

Mas avalie bem e planeje como vai ser a sua condição de particionamento (ex.: por data, tipo e etc) e crie as tabelas filhas, nunca esquecendo de criar também as constraint de checks em cada delas.

E nunca se esqueça que a partir dai, as suas queries irão ter que levar em consideração esta condição logica definida nas checks. O otimizados de consultas do Postgres utiliza isto pra determinar em qual(is) partição(ões) ele vai buscar a(s) informação(ões) que a sua query pede.

Caso não faça isso, o otimizador de query pode realizar um seq_scan em todas as tabelas filhas (partições) e com isso criar uma situação muito ruim em desempenho.

De uma boa olhada na documentação em http://www.postgresql.org/docs/9.1/static/ddl-partitioning.html

Após vc ter feito isto tudo, vc pode ativar as triggers que deve fazer para distribuir os dados nas partições quando forem inseridos.

A partir disto, se estiver tudo correto, irão fazer as buscas (por indice ou sequenciais) na partição filha correspondente e na tabela pai.

Enquanto vc nao mover as info antiga da tabela pai pras filhas, elas serão encontradas na pai. E com o tempo, vc vai movendo as linhas da tabela pai para as tabelas filhas (partições) nas madrugadas ou em janelas de manutenção, como preferir.

Mas lembre-se de ter tudo isso planejado passo a passo e se possível, testado antes em uma copia do banco de testes.

Boa sorte pra vc e abraços!

--
Lucio Chiessi
Rio de Janeiro - Brasil
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a