El particionamiento de listas (list partitioning) en PostgreSQL/PostGIS es un método de particionamiento declarativo que permite dividir una tabla grande en varias subtablas, según los valores discretos de una columna (por ejemplo: por región, tipo, año, etc.).
Esto resulta especialmente útil en SIG cuando se desea gestionar capas de gran tamaño (por ejemplo, una tabla con millones de objetos geográficos divididos por país, o por tipo de zona).
¿Qué es la partición de listas?
Es una técnica que :
- Crea una tabla principal (la tabla padre),
- Y varias particiones (tablas hijas), cada una de las cuales contiene filas correspondientes a un valor específico de una columna.
Ejemplos de uso en SIG:
- Partición de una tabla de edificios por tipo (residencial, industrial, público, etc.)
- División de una tabla de zonas por municipios o islas (Mauricio, Rodrigues, etc.).
- Partición de una tabla de carreteras por tipo de vía (autopista, carretera, vía verde, etc.)
Ventajas
- Consultas más rápidas si la cláusula WHERE filtra por tipo
- Menos bloqueos de escritura
- Mantenimiento más sencillo (se puede archivar o separar una partición)
- Puede combinarse con la gestión del vacío, índices locales, disparadores específicos de partición, etc.
Limitaciones
- La columna de partición debe estar bien elegida (valores discretos, no demasiados)
- Una fila sólo puede ir a una partición
- Restricciones e índices deben ser definidos en cada partición (desde PostgreSQL 13, algunos pueden ser heredados)
¿Qué pasa con los diferentes tipos de geometría (punto, línea, polígono)?
En PostGIS, puede utilizar tablas particionadas para almacenar diferentes tipos de geometría en particiones separadas. PostgreSQL soporta particionamiento de listas (LIST PARTITIONING), que es muy adecuado para separar entidades geográficas según su tipo (punto, línea, polígono).
1. Creación de la tabla principal
La tabla principal es una tabla particionada en función del tipo de geometría.
CREATE TABLE formation.objets_geographiques (
id SERIAL,
nom TEXT NOT NULL,
geom GEOMETRY NOT NULL,
type_geom TEXT NOT NULL,
PRIMARY KEY (type_geom, id) -- Ajout de type_geom dans la clé primaire
) PARTITION BY LIST (type_geom);
Aquí, la columna type_geom se utiliza como clave de partición.
2. Creación de particiones para cada tipo de geometría
Se crean particiones específicas para cada tipo de geometría (POINT, LINESTRING, POLYGON).
CREATE TABLE formation.objets_points
PARTITION OF formation.objets_geographiques
FOR VALUES IN (‘POINT’);
CREATE TABLE formation.objets_lignes
PARTITION OF formation.objets_geographiques
FOR VALUES IN (‘LINESTRING’);
CREATE TABLE formation.objets_polygones
PARTITION OF formation.objets_geographiques
FOR VALUES IN (‘POLYGON’);

3. Añadir una restricción de tipo de geometría
Para asegurarnos de que cada partición contiene sólo el tipo correcto de geometría, añadimos una restricción CHECK.
ALTER TABLE formation.objets_points ADD CONSTRAINT chk_geom_point
CHECK (GeometryType(geom) = ‘POINT’);
ALTER TABLE formation.objets_lignes ADD CONSTRAINT chk_geom_linestring
CHECK (GeometryType(geom) = ‘LINESTRING’);
ALTER TABLE formation.objets_polygones ADD CONSTRAINT chk_geom_polygon
CHECK (GeometryType(geom) = ‘POLYGON’);
4. Inserción de datos
Los datos se redirigirán automáticamente a la partición correcta en función del valor de type_geom.
INSERT INTO formation.objets_geographiques (nom, geom, type_geom)
VALUES
(‘École’, ST_GeomFromText(‘POINT(57.5 -20.2)’, 4326), ‘POINT’),
(‘Route côtière’, ST_GeomFromText(‘LINESTRING(57.5 -20.2, 57.6 -20.3)’, 4326), ‘LINESTRING’),
(‘Parc national’, ST_GeomFromText(‘POLYGON((57.5 -20.2, 57.6 -20.3, 57.7 -20.1, 57.5 -20.2))’, 4326), ‘POLYGON’);

5. Creación de índices en las particiones
Se pueden crear índices GIST o SP-GiST en cada partición para mejorar el rendimiento de las consultas espaciales.
CREATE INDEX idx_geom_points ON formation.objets_points USING GIST (geom);
CREATE INDEX idx_geom_lignes ON formation.objets_lignes USING GIST (geom);
CREATE INDEX idx_geom_polygones ON formation.objets_polygones USING GIST (geom);
Ventajas de la partición en PostGIS
- Mejora el rendimiento de las consultas espaciales al reducir el volumen de datos analizados.
- Facilita la gestión y organización de los objetos geográficos.
- Simplifica el mantenimiento (por ejemplo, la eliminación de una partición específica sin afectar a las demás).
6. Consulta para recuperar un tipo específico
Si sólo desea recuperar polígonos, PostgreSQL consulta directamente la partición correcta.
SELECT * FROM formation.objets_geographiques WHERE type_geom = ‘POLYGON’;

Esto mejora la eficacia de las consultas al evitar el escaneo de datos innecesarios.
Conclusión
La partición por tipo de geometría en PostGIS permite una gestión eficaz de los datos espaciales, al tiempo que optimiza el rendimiento de las consultas y el almacenamiento.