Tamanho do banco de dados inicial do PostgreSQL

12

Existem duas partes na minha pergunta.

  1. Existe uma maneira de especificar o tamanho inicial de um banco de dados no PostgreSQL?
  2. Se não houver, como você lida com a fragmentação quando o banco de dados cresce com o tempo?

Recentemente, migrei do MSSQL para o Postgres e uma das coisas que fizemos no mundo do MSSQL ao criar um banco de dados foi especificar o tamanho inicial do banco de dados e do log de transações. Isso reduziu a fragmentação e aumentou o desempenho, especialmente se o tamanho "normal" do banco de dados for conhecido previamente.

O desempenho do meu banco de dados diminui à medida que o tamanho aumenta. Por exemplo, a carga de trabalho pela qual estou passando normalmente leva 10 minutos. À medida que o banco de dados cresce, esse tempo aumenta. Fazer uma VÁCUO, VÁCUO CHEIO e VÁCUO CHEIO ANALISAR não parece resolver o problema. O que resolve o problema de desempenho é interromper o banco de dados, desagrupar a unidade e, em seguida, fazer uma ANÁLISE COMPLETA DE VÁCUO leva a execução do meu teste aos 10 minutos originais. Isso me leva a suspeitar que a fragmentação é o que está me causando dor.

Não consegui encontrar nenhuma referência para reservar espaço para tabelas / banco de dados no Postgres. Ou estou usando a terminologia errada e, portanto, não encontrando nada, ou existe uma maneira diferente de mitigar a fragmentação do sistema de arquivos no Postgres.

Alguma dica?

A solução

As respostas fornecidas ajudaram a confirmar o que eu comecei a suspeitar. O PostgreSQL armazena o banco de dados em vários arquivos e é isso que permite que o banco de dados cresça sem se preocupar com fragmentação. O comportamento padrão é compactar esses arquivos até a borda com dados da tabela, o que é bom para tabelas que raramente mudam, mas é ruim para tabelas atualizadas com frequência.

O PostgreSQL utiliza o MVCC para fornecer acesso simultâneo aos dados da tabela. Sob esse esquema, cada atualização cria uma nova versão da linha que foi atualizada (isso pode ser por carimbo de data ou hora, quem sabe?). Os dados antigos não são excluídos imediatamente, mas marcados para exclusão. A exclusão real ocorre quando uma operação VACUUM é executada.

Como isso se relaciona com o fator de preenchimento? O fator de preenchimento padrão da tabela de 100 compacta completamente as páginas da tabela, o que significa que não há espaço na página da tabela para conter linhas atualizadas, ou seja, linhas atualizadas serão colocadas em uma página de tabela diferente da linha original. Isso é ruim para o desempenho, como mostra minha experiência. Como minhas tabelas de resumo são atualizadas com muita frequência (até 1500 linhas / s), optei por definir um fator de preenchimento de 20, ou seja, 20% da tabela será para dados de linha inseridos e 80% para dados de atualização. Embora isso possa parecer excessivo, a grande quantidade de espaço reservado para as linhas atualizadas significa que as linhas atualizadas permanecem na mesma página que a original e existe uma página da tabela que não está cheia quando o daemon de autovacuum é executado para remover linhas obsoletas.

Para "consertar" meu banco de dados, fiz o seguinte.

  1. Defina o fator de preenchimento das minhas tabelas de resumo como 20. Você pode fazer isso no momento da criação passando um parâmetro para CREATE TABLE ou após o fato via ALTER TABLE. Emiti o seguinte comando plpgsql:ALTER TABLE "my_summary_table" SET (fillfactor = 20);
  2. Emitiu um VACUUM FULL, pois isso grava uma versão completamente nova do arquivo de tabela e, por implicação, grava um novo arquivo de tabela com o novo fator de preenchimento .

Ao executar novamente meus testes, não vejo degradação no desempenho, mesmo quando o banco de dados é tão grande quanto eu preciso e com muitos milhões de linhas.

TL; DR - A fragmentação do arquivo não foi a causa, foi a fragmentação do espaço de tabela. Isso é atenuado, ajustando o fator de preenchimento da tabela para se adequar ao seu caso de uso específico.

CadentOrange
fonte
Duvido que seja a operação de redimensionamento de arquivos. Meu palpite é que a manutenção dos índices é o que está retardando as inserções. Existe uma discussão atual na lista PG discussão sobre isso (embora sem uma solução): postgresql.1045698.n5.nabble.com/...
a_horse_with_no_name

Respostas:

4
  1. Não é a única coisa perto disso quando você compila o servidor com a opção --with-segsize, isso pode ajudar se sua tabela estiver ocupando mais espaço que um show e seu sistema de arquivos puder lidar com um único arquivo durante um show. Se você estiver inserindo 20 shows, precisará criar 20 arquivos, se você não usar essa opção. Se o seu sistema de arquivos puder manipular um arquivo durante uma apresentação, você pode configurá-lo com um valor alto, provavelmente verá algum benefício, na pior das hipóteses, um pequeno benefício.

  2. Veja CLUSTER http://www.postgresql.org/docs/9.1/static/sql-cluster.html e FILLFACTOR http://www.postgresql.org/docs/9.1/static/sql-createtable.html , http://www.postgresql.org/docs/9.1/static/sql-createindex.html

Observe que FILLFACTOR pode ser aplicado a tabelas e índices.

Kuberchaun
fonte
5

Há outra coisa em jogo que ainda não inseriu suas equações: atualização QUENTE . Respostas relacionadas:

Definir FILLFACTORa tão baixo quanto 20 faz parecer excessivo. Incha a mesa até cinco vezes o seu tamanho. Se as atualizações do HOT funcionarem, você não precisará ir tão baixo - normalmente .

Há exceções: as atualizações HOT podem reutilizar tuplas mortas de transações anteriores , não das mesmas ou simultâneas . Portanto, carga simultânea pesada ou transações longas que atualizam repetidamente as mesmas linhas podem garantir uma configuração tão baixa (ou até mais baixa).

Se você tiver grandes atualizações, alterando grandes partes da tabela de uma só vez, convém dividi-las em dois pedaços, de preferência alterando apenas o número de linhas ao mesmo tempo que caber localmente na página de dados. Mas isso é difícil de estimar e regular.

Observe que as atualizações HOT funcionam apenas quando as colunas alteradas não estão envolvidas nos índices de forma alguma (nem como dados nem como condição em um índice parcial). Você pode estar bloqueando atualizações HOT com índices em colunas atualizadas. Se eles forem descartáveis, você poderá obter um desempenho geral melhor sem eles.

Por fim, você pode definir parâmetros de autovacuum por tabela . Você pode direcionar tabelas altamente atualizadas com configurações agressivas, permitindo um pacote de linhas um pouco mais apertado do que apenas FILLFACTOR 20.

Erwin Brandstetter
fonte
1
Coisas interessantes, vou ler e tentar entender melhor o que as atualizações HOT significam para o meu sistema.
CadentOrange
4

Se o seu problema for fragmentação de arquivo, não, não existe. No Postgres, cada tabela obtém seu próprio arquivo ou conjunto de arquivos, se utilizar o TOAST, no sistema de arquivos. Isso difere, digamos, do Oracle (ou aparentemente MS-SQL), onde você cria arquivos de espaço de tabela de tamanho pré-definido para colocar suas tabelas - embora mesmo lá possa haver problemas de fragmentação do sistema de arquivos se os arquivos de espaço de tabela forem estendidos ou o sistema de arquivos for mal fragmentado para começar.

Quanto à sua segunda pergunta ... Eu não tenho idéia de como lidar com a fragmentação do sistema de arquivos, pois o MS-Windows é o único SO em que tive problemas de fragmentação e não executo o MS-Windows mais do que absolutamente precisa ser hoje em dia. Talvez colocar os arquivos de banco de dados em seus próprios discos possa atenuar isso em certa medida.

gsiems
fonte
Lembre-se de que você possui fragmentação interna do banco de dados PostgreSQL e fragmentação externa do sistema de arquivos. Creio que interno pode ser mitigado com VACUUM e usando CLUSTERS e FILLFACTOR. O sistema de arquivos pode ser tratado executando uma desfragmentação para o sistema de arquivos fornecido. E os sistemas de arquivos Linux / Unix podem ficar fragmentados algumas vezes, dependendo da carga de trabalho e do tipo de sistema de arquivos.
Kuberchaun
Atualmente, a fragmentação do sistema de arquivos não é um grande problema com o NTFS.
A_horse_with_no_name 17/07/2012
1
Eu pensei que o NTFS era notório por isso? Minha máquina de estação de trabalho fica muito bem fragmentada, a única coisa que a mantém sob controle é uma desfragmentação programada que o Windows7 executa diariamente.
Kuberchaun