sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cuántos registros puedo almacenar en 5 MB de PostgreSQL en Heroku?

Espacio en disco ocupado

Calcular el espacio en disco no es trivial. Tienes que tener en cuenta:

  • Los gastos generales por tabla (pequeños, básicamente las entradas en el catálogo del sistema, pueden no afectarlo en Heroku).

  • Los sobrecarga por fila (HeapTupleHeader) y por página de datos (PageHeaderData). Detalles sobre el diseño de página en el manual.

  • Espacio perdido por alineación de tipos de datos .

  • Espacio para un mapa de bits NULL . Efectivamente gratis para tablas de 8 columnas o menos, irrelevante para tu caso.

  • filas muertas después de UPDATE / DELETE .

  • Tamaño de índice(s) . Tendrás una clave principal, ¿verdad? El tamaño del índice es similar al de una tabla con solo las columnas indexadas y menos sobrecarga.

  • El requisito de espacio real de los datos, según los respectivos tipos de datos . Detalles de los tipos de caracteres (incluidos los tipos de longitud fija) en el manual:

    El requisito de almacenamiento para una cadena corta (hasta 126 bytes) es de 1 byte más la cadena real, que incluye el espacio de relleno en el caso de character . Las cadenas más largas tienen 4 bytes de sobrecarga en lugar de 1

    Más detalles para todos los tipos en el catálogo del sistema pg_type .

  • La base de datos codificación en particular para los tipos de caracteres. UTF-8 usa hasta cuatro bytes para almacenar un carácter (pero los caracteres ASCII de 7 bits siempre ocupan solo un byte, incluso en UTF-8).

  • Otras pequeñas cosas que pueden afectar su caso, como TOAST - que no debería afectarte con cadenas de 64 caracteres.

Calcular con caso de prueba

Un método simple para encontrar una estimación es crear una tabla de prueba, llenarla con datos ficticios y medir con funciones de tamaño de objeto de la base de datos::

SELECT pg_size_pretty(pg_relation_size('tbl'));

Incluyendo índices:

SELECT pg_size_pretty(pg_total_relation_size('tbl'));

Una prueba rápida muestra los siguientes 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

Después de agregar una clave principal:

ALTER TABLE test ADD CONSTRAINT test_pkey PRIMARY KEY(a);

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

Entonces, esperaría un máximo de alrededor de 44k filas sin y alrededor de 36k filas con clave principal.