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ósUPDATE
/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 decharacter
. Strings mais longas têm 4 bytes de overhead em vez de 1
Mais detalhes para todos os tipos no catálogo do sistemapg_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.