On 21/12/17 01:55, Alvaro Herrera wrote:
Jaime Casanova escribió:

En realidad, deberías tener problemas mucho antes de llegar a esa
cantidad de tablas.
Estaba pensando, por ejemplo, en que al crear una tabla se consumen al
menos 3 oid (1 por la tabla y 2 por los tipos de datos asociados que
se crean) y si la tabla tiene al menos un PK se consumen 5 oid y si
creas constraints u otros objetos se consumirán mas oid.

Pero asumamos el caso más simple, una tabla sin constraints, sólo 3
oids consumidos por tabla; considerando que un oid es un tipo de dato
de 32bits sólo se podrían crear cerca de 1431 millones de tablas. Pero
siendo que crearás índices, funciones, constraints y otros lo más
probable es que solo puedas crear unas decenas o centenas de millones
de tablas.
Esto es cierto, pero los OIDs sólo tienen que ser únicos dentro de un
mismo catálogo.  Si bien usan todos el mismo generador, el sistema está
preparado para buscar un nuevo número si el que se asigna ya está usado.
Entonces los constraints, como están en otro catálogo, no disminuyen el
límite de tablas, pero los índices sí.  Pero cada tabla tiene además un
tipo compuesto y un tipo de array, o sea que cada tabla necesita 3 OIDs
en pg_class; si agregas uno para el índice (que también estará en
pg_class) usará 4 OIDs, así que sólo podrías tener 2^32-1 / 4 es decir
unos 2^30 tablas (esto son 1073741824 que está muy cerca de lo que logró
AHT el 2013 -- aunque él no tenía índice, así que su límite absoluto por
este motivo era el doble).  Esto siempre y cuando no pongas columnas que
necesiten una tabla toast, porque entonces agregas dos OIDs más en
pg_class, con lo que llegas a unas 2^29 (quinientos millones de tablas?)

En todo caso, más que seguro que Flor no necesita mil millones de tablas
:-)


    Os habéis acercado mucho, pero no del todo ^___^

    Efectivamente, los oids usan el mismo generador, pero PostgreSQL busca huecos (y de hecho es lo que ralentiza exponencialmente la creación de tablas próximo al límite, por razones obvias) en cada tabla, que reusa oids. Así quien limita es pg_type (tocayo, muy bien identificabas que se crea el tipo tabla y tabla[], pero éstos no gastan oids de pg_class sino de pg_type).

    Así, en una tabla vacía (sin índices, PKs, FKs, etc) quien más oids consume es pg_type (2 por tabla). De ahí que el máximo número de tablas es, si no me equivoco:

(2^32 – 330) / 2 = 2_147_483_483

siendo 330 el número de pg_types que exista tras un initdb, y que varía versión a versión; son 330 en algún PG anterior, a día de hoy serán más, limitando un poco más el número máximo de tablas.


    Ahora bien, todas estas tablas, vacías (sin columnas) ocupan aproximadamente 6TB. Así que no recomiendo a nadie crear tantas tablas sea como fuere ;)


    Saludos,

    Álvaro


--

Álvaro Hernández Tortosa


-----------
<8K>data


Reply via email to