O particionamento de lista no PostgreSQL/PostGIS é um método de particionamento declarativo que permite dividir uma tabela grande em várias subtabelas, de acordo com os valores discretos de uma coluna (por exemplo: por região, tipo, ano etc.).
Isso é particularmente útil no GIS quando se deseja gerenciar grandes camadas (por exemplo, uma tabela com milhões de objetos geográficos divididos por país ou por tipo de área).
O que é particionamento de lista?
É uma técnica que :
- Cria uma tabela principal (a tabela pai),
- E várias partições (tabelas filhas), cada uma das quais contém linhas correspondentes a um valor específico em uma coluna.
Exemplos de uso em GIS:
- Particionamento de uma tabela de edifícios por tipo (residencial, industrial, público etc.)
- Particionar uma tabela de zonas por município ou ilha (Maurício, Rodrigues, etc.)
- Particionar uma tabela de estradas por tipo de estrada (autoestrada, estrada, via verde etc.)
Benefícios
- Consultas mais rápidas se a cláusula WHERE filtrar por tipo
- Menos bloqueios de gravação
- Manutenção mais fácil (você pode arquivar ou desanexar uma partição)
- Pode ser combinado com gerenciamento de vácuo, índices locais, acionadores específicos da partição etc.
Limitações
- A coluna da partição deve ser bem escolhida (valores discretos, não muitos)
- Uma linha só pode entrar em uma partição
- As restrições e os índices devem ser definidos em cada partição (a partir do PostgreSQL 13, alguns podem ser herdados)
E quanto aos diferentes tipos de geometria (ponto, linha, polígono)?
No PostGIS, você pode usar tabelas particionadas para armazenar diferentes tipos de geometria em partições separadas. O PostgreSQL oferece suporte ao particionamento de lista (LIST PARTITIONING), que é adequado para separar entidades geográficas de acordo com seu tipo (ponto, linha, polígono).
1. Criação da tabela principal
A tabela principal é uma tabela particionada com base no tipo de geometria.
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);
Aqui, a coluna type_geom é usada como chave de partição.
2. Criação de partições para cada tipo de geometria
São criadas partições específicas para cada tipo de geometria (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. Adição de uma restrição de tipo de geometria
Para garantir que cada partição contenha apenas o tipo correto de geometria, adicionamos uma restrição 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. Inserção de dados
Os dados serão automaticamente redirecionados para a partição correta, dependendo do valor 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. Criação de índices em partições
Os índices GIST ou SP-GiST podem ser criados em cada partição para melhorar o desempenho das consultas espaciais.
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);
Benefícios do particionamento no PostGIS
- Melhora o desempenho das consultas espaciais, reduzindo o volume de dados analisados.
- Facilita o gerenciamento e a organização de objetos geográficos.
- Simplifica a manutenção (por exemplo, a exclusão de uma partição específica sem afetar as outras).
6. Consulta para recuperar um tipo específico
Se você quiser recuperar apenas polígonos, o PostgreSQL consulta diretamente a partição correta.
SELECT * FROM formation.objets_geographiques WHERE type_geom = ‘POLYGON’;

Isso aumenta a eficiência das consultas, evitando a varredura de dados desnecessários.
Conclusão
O particionamento por tipo de geometria no PostGIS permite o gerenciamento eficiente de dados espaciais e, ao mesmo tempo, otimiza o desempenho da consulta e do armazenamento.