Quão grande é muito grande para uma tabela PostgreSQL?

127

Estou trabalhando no design de um projeto RoR para minha empresa, e nossa equipe de desenvolvimento já se debateu um pouco sobre o design, especificamente o banco de dados.

Temos um modelo chamado Messageque precisa ser persistido. É um modelo muito pequeno com apenas três colunas de db além do id, no entanto, provavelmente haverá MUITOS desses modelos quando entrarmos em produção. Estamos vendo até 1.000.000 de inserções por dia. Os modelos só serão pesquisados ​​por duas chaves estrangeiras neles que podem ser indexadas. Além disso, os modelos nunca precisam ser excluídos, mas também não precisamos mantê-los depois de terem cerca de três meses.

Então, o que estamos nos perguntando é se a implementação dessa tabela no Postgres apresentará um problema de desempenho significativo? Alguém tem experiência com bancos de dados SQL muito grandes para nos dizer se isso será ou não um problema? E em caso afirmativo, que alternativa devemos escolher?

Dylan Karr
fonte
3
com uma boa camada de cache e alguma configuração pequena no PG você deve ficar bem. Você deve resolver os problemas de desempenho caso a caso e evitar a pré-otimização. Dito isso, o particionamento e a replicação são sempre ótimas opções das quais você pode tirar proveito quando encontrar gargalos.
Sam
1
Questão relacionada aqui e aqui .
Erwin Brandstetter
5
Processamos cerca de 30 milhões de mensagens por dia em um banco de dados PostgreSQL de 5+ TB, funciona bem.
Frank Heikens
consulte também stackoverflow.com/questions/3132444/…
rogerdpack
1
Para sua informação, estou lendo postgresql.org/about hoje e percebi que diz que (em princípio) o número de linhas em uma tabela é ilimitado.
Al Chou

Respostas:

115

As linhas por tabela não serão um problema por si só.

Então, grosso modo, 1 milhão de linhas por dia durante 90 dias é 90 milhões de linhas. Não vejo porque o Postgres não pode lidar com isso, sem saber todos os detalhes do que você está fazendo.

Dependendo de sua distribuição de dados, você pode usar uma mistura de índices, índices filtrados e algum tipo de particionamento de tabela para acelerar o processo, uma vez que você ver quais problemas de desempenho você pode ou não ter. Seu problema será o mesmo em qualquer outro RDMS que eu conheça. Se você precisa de apenas 3 meses de design de dados em um processo de podar os dados, não precisa mais. Dessa forma, você terá um volume consistente de dados na mesa. Você tem sorte de saber quantos dados existirão, teste seu volume e veja o que consegue. Testar uma tabela com 90 milhões de linhas pode ser tão fácil quanto:

select x,1 as c2,2 as c3
from generate_series(1,90000000) x;

https://wiki.postgresql.org/wiki/FAQ

Limit   Value
Maximum Database Size       Unlimited
Maximum Table Size          32 TB
Maximum Row Size            1.6 TB
Maximum Field Size          1 GB
Maximum Rows per Table      Unlimited
Maximum Columns per Table   250 - 1600 depending on column types
Maximum Indexes per Table   Unlimited
Kuberchaun
fonte
19
Concordo que 90 milhões de linhas não serão um problema para o PostgreSQL. Mas pode ser um problema para um ORM com PostgreSQL. (Um ORM com qualquer dbms, na verdade.)
Mike Sherrill 'Cat Recall'
@ MikeSherrill'Catcall 'Bom ponto, eu estava focado apenas em "Qual o tamanho de uma tabela PostgreSQL?"
Kuberchaun
2
@yeyo: Porque ORMs geralmente usam muitas consultas para obter dados que poderiam ser retornados com apenas uma ou duas. O OP está usando Ruby on Rails.
Mike Sherrill 'Cat Recall'
39
Isso é um pouco tarde, mas acho que em muitos casos (especialmente com rails / registro ativo) é comum remover completamente o ORM da equação e escrever uma string sql bruta para consultar por motivos de desempenho. Não deixe seu ORM tomar decisões de dados por você! É um acessório não essencial.
Stefan Theard
2
A URL sobre citada na URL não mostra esses limites atualmente - alguém sabe para onde ela foi movida?
Cortado em
58

Outra maneira de acelerar significativamente suas consultas em uma tabela com mais de 100 milhões de linhas é agrupar a tabela no índice mais frequentemente usado em suas consultas fora do horário de expediente. Temos uma tabela com> 218 milhões de linhas e encontramos melhorias de 30X.

Além disso, para uma tabela muito grande, é uma boa ideia criar um índice em suas chaves estrangeiras.

James Doherty
fonte
> nas horas de folga agrupe a tabela no índice que é mais frequentemente usado em suas consultas ... você pode explicar como isso é feito?
espião de
6
Sim, aqui está um passo a passo EXEMPLO: 1) A tabela a que me refiro é chamada de investimento neste exemplo. 2) O índice mais usado nas consultas é (bankid, record_date) Então, aqui está o passo a passo: 1) psql -c "drop index investment_bankid_rec_dt_idx;" dbname 2) psql -c "criar índice investment_bankid_rec_dt_idx no investimento (bankid, record_date);" 3) psql -c "cluster investment_bankid_rec_dt_idx sobre investimento;" 4) vacuumdb -d ccbank -z -v -t investment Portanto, nas etapas um e dois, eliminamos o índice e o recriamos.
James Doherty
3
Na etapa 3, criamos o cluster. Isso basicamente coloca a tabela do banco de dados na ordem física do índice, portanto, quando o postgresql executa uma consulta, ele armazena em cache as próximas linhas mais prováveis. Etapa 4, limpamos o banco de dados para redefinir as estatísticas para o planejador de consulta
James Doherty