Re: CANTIDAD MAXIMA DE TABLAS EN UN SCHEMA

From: Álvaro Hernández Tortosa <aht(at)8kdata(dot)com>
To: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>, Jaime Casanova <jaime(dot)casanova(at)2ndquadrant(dot)com>
Cc: FLOR AVILA ELIAS <favila(at)ditelgroup(dot)com>, Ayuda Esp PostgreSQL <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: CANTIDAD MAXIMA DE TABLAS EN UN SCHEMA
Date: 2017-12-30 14:24:03
Message-ID: 4ecad5fe-6aea-2a3e-5257-4684c40a485c@8kdata.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Fernando A 2018-01-01 12:01:57 Consulta Recuperar Base de Datos desde carpeta Data Linux a Windows
Previous Message Alvaro Herrera 2017-12-29 22:37:24 Re: Recorrer Tabla/cursor y formar un solo dato