Cómo particionar una tabla grande de PostgreSQL

Las tablas grandes son difíciles de manejar en cualquier sistema de bases de datos y por eso dichos sistemas implementan soluciones que nos permiten dividir las tablas en un conjunto determinado de tablas más pequeñas y manejables que, en conjunto, contienen la misma información que la tabla original.

En este artículo vamos a explicar cómo particionar fácilmente una tabla en PostgreSQL.

La tabla pedidos no es muy grande, pero nos servirá como ejemplo:

Vamos a ver los campos por los que está compuesta la tabla y buscar el criterio de particionado más adecuado (rango, lista o hash):

En este caso vamos a particionar la tabla por rango atendiendo al año del pedido ya que, como se puede observar, se conseguirá un reparto prácticamente equitativo entre las particiones. Además, los pedidos más antiguos casi no se consultan mientras que los pedidos más recientes se consultan con frecuencia. El modo de partición elegido nos permitirá definir distintas estrategias de mantenimiento según la partición de la que se trate.

Para particionar una tabla seguiremos los siguientes pasos:

Paso 1. Creamos la tabla particionada.

Fácil ¿no?

Paso 2. Creamos las particiones necesarias.

create table pedidos_2003 partition of pedidos_tmp for values from (‘2003-01-01’) to (‘2004-01-01’);

create table pedidos_2004 partition of pedidos_tmp for values from (‘2004-01-01’) to (‘2005-01-01’);

[…]

create table pedidos_2021 partition of pedidos_tmp for values from (‘2021-01-01’) to (‘2022-01-01’);

create table pedidos_2022 partition of pedidos_tmp for values from (‘2022-01-01’) to (‘2023-01-01’);

Tenga en cuenta que el límite FROM es incluyente y el límite TO es excluyente.

Paso 3. Cargamos los datos de la tabla original en la tabla particionada.

insert into pedidos_tmp (select * from pedidos);

Y comprobamos que los datos se han insertado correctamente en las particiones esperadas.

Paso 4. Eliminamos la tabla original y renombramos la tabla particionada.

Y ya lo tenemos.

No olvide crear las nuevas particiones con antelación, conforme las vaya necesitando si no el primer pedido del año 2023 no tendrá dónde insertarse y dará error. Otra opción es crear una partición DEFAULT donde se grabarán los registros que no tengan lugar en las otras particiones.

create table pedidos_2024 partition of pedidos default; 

Más adelante os explicaré otros métodos de partición: LIST y HASH. Muy interesantes también, sobre todo éste último.