PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Quantos registros posso armazenar em 5 MB de PostgreSQL no Heroku?

Espaço em disco ocupado


Calcular o espaço em disco não é trivial. Você tem que levar em consideração:

  • A sobrecarga por tabela (pequena, basicamente as entradas no catálogo do sistema, pode não afetar você no Heroku).

  • A sobrecarga por linha (HeapTupleHeader) e por página de dados (PageHeaderData). Detalhes sobre o layout da página no manual.

  • Espaço perdido para alinhamento de tipo de dados .

  • Espaço para um bitmap NULL . Efetivamente grátis para tabelas de 8 colunas ou menos, irrelevante para o seu caso.

  • Linhas mortas após UPDATE / DELETE .

  • Tamanho de índices . Você terá uma chave primária, certo? O tamanho do índice é semelhante ao de uma tabela com apenas as colunas indexadas e menos sobrecarga.

  • O requisito de espaço real dos dados, dependendo dos respectivos tipos de dados . Detalhes para tipos de caracteres (incluindo tipos de comprimento fixo) no manual:

    O requisito de armazenamento para uma string curta (até 126 bytes) é 1 byte mais a string real, que inclui o preenchimento de espaço no caso de character . Strings mais longas têm 4 bytes de overhead em vez de 1

    Mais detalhes para todos os tipos no catálogo do sistema pg_type .

  • A codificação do banco de dados em particular para os tipos de caracteres. UTF-8 usa até quatro bytes para armazenar um caractere (mas caracteres ASCII de 7 bits sempre ocupam apenas um byte, mesmo em UTF-8).

  • Outras pequenas coisas que podem afetar seu caso, como TOAST - o que não deve afetá-lo com cadeias de 64 caracteres.

Calcular com caso de teste


Um método simples para encontrar uma estimativa é criar uma tabela de teste, preenchê-la com dados fictícios e medir com funções de tamanho de objeto de banco de dados::
SELECT pg_size_pretty(pg_relation_size('tbl'));

Incluindo índices:
SELECT pg_size_pretty(pg_total_relation_size('tbl'));

Um teste rápido mostra os seguintes resultados:
CREATE TABLE test(a text, b text);
INSERT INTO test -- quick fake of matching rows
SELECT chr((g/1000 +32)) || to_char(g%1000, 'FM000')
     , repeat (chr(g%120 + 32), 64)
FROM   generate_series(1,50000) g;

SELECT pg_size_pretty(pg_relation_size('test'));       -- 5640 kB
SELECT pg_size_pretty(pg_total_relation_size('test')); -- 5648 kB

Depois de adicionar uma chave primária:
ALTER TABLE test ADD CONSTRAINT test_pkey PRIMARY KEY(a);

SELECT pg_size_pretty(pg_total_relation_size('test')); -- 6760 kB

Então, eu esperaria um máximo de cerca de 44k linhas sem e em torno de 36k linhas com chave primária.