Le list partitioning (partitionnement par liste) dans PostgreSQL/PostGIS est une méthode de partitionnement déclaratif qui permet de diviser une grande table en plusieurs sous-tables, en fonction des valeurs discrètes d’une colonne (par exemple : par région, type, année, etc.).
C’est particulièrement utile en SIG quand on souhaite gérer des couches volumineuses (ex : une table avec des millions d’objets géographiques répartis par pays, ou par type de zone).
Qu’est-ce que le list partitioning ?
C’est une technique qui :
- Crée une table principale (la table parente),
- Et plusieurs partitions (tables filles) qui contiennent chacune les lignes correspondant à une valeur spécifique d’une colonne.
Exemples d’usage en SIG :
- Partitionner une table
batiments
selon le type (résidentiel
,industriel
,public
…) - Partitionner une table
zones
selon la commune ou l’île (Maurice
,Rodrigues
, etc.) - Partitionner une table
routes
selon le type de route (autoroute
,chemin
,voie verte
, etc.)
Avantages
- Requêtes plus rapides si la clause WHERE filtre sur
type
- Moins de verrous en écriture
- Maintenance plus facile (on peut archiver ou détacher une partition)
- Peut être combiné avec la gestion du vacuum, indexes locaux, triggers spécifiques par partition…
Limitations
- La colonne de partition doit être bien choisie (valeurs discrètes, pas trop nombreuses)
- Une ligne ne peut aller que dans une seule partition
- Les contraintes et index doivent être définis sur chaque partition (à partir de PostgreSQL 13, certains peuvent être hérités)
Et pour les différents types de géométrie (point,ligne,polygone)?
Dans PostGIS, vous pouvez utiliser les tables partitionnées pour stocker différents types de géométries dans des partitions distinctes. PostgreSQL prend en charge la partitionnement par liste (LIST PARTITIONING), qui est bien adapté pour séparer des entités géographiques en fonction de leur type (point, ligne, polygone).
1. Création de la table principale
La table principale est une table partitionnée basée sur le type de géométrie.
Ici, la colonne type_geom sert de clé de partition. On crée des partitions spécifiques pour chaque type de géométrie (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’); Pour garantir que chaque partition ne contienne que le bon type de géométrie, on ajoute une contrainte 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’); Les données seront automatiquement redirigées vers la bonne partition selon la valeur 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’); On peut créer des index GIST ou SP-GiST sur chaque partition pour améliorer les performances des requêtes spatiales. 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); Avantages du partitionnement dans PostGIS
Si on veut récupérer uniquement les polygones, PostgreSQL interroge directement la bonne partition. SELECT * FROM formation.objets_geographiques WHERE type_geom = ‘POLYGON’; Cela améliore l’efficacité des requêtes en évitant de scanner des données inutiles. Le partitionnement par type de géométrie dans PostGIS permet une gestion efficace des données spatiales, tout en optimisant les performances d’interrogation et de stockage.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);
2. Création des partitions pour chaque type de géométrie
3. Ajout d’une contrainte sur le type de géométrie
4. Insertion des données
5. Création d’index sur les partitions
6. Requête pour récupérer un type spécifique
Conclusion