#1 Wed 23 January 2013 17:30
- sigdu80
- Participant actif
- Date d'inscription: 2 Sep 2010
- Messages: 112
[Postgis] Optimisation d'intersection de geom
Bonjour à tous,
je souhaite optimiser au max, la recherche des geoms d'intersections entre 2 tables.
Voici la requête :
Code:
SELECT id,lower,upper,st_intersection(a.geom, b.geom) FROM parcelles a, infos b WHERE a.id IN (1,2) AND a.geom && b.geom AND st_intersects(a.geom, b.geom);
La table infos a + de 8000 lignes. Je fais des tests sur 2 parcelles.
Donc : 8000 * 2 = 16000 lignes où je vérifie s'il y a intersection entre les 2 geoms.
Si il y a bien intersection, je veux le geom résultant de l'intersection.
J'ai 314 lignes de résultats, çà met 23 sec à se calculer, dont presque la moitié concernant les tests st_intersects, et l'autre moitié pour le st_intersection.
J'ai modifié ma requête pour d'abord filtrer l'ensemble des lignes en testant l'intersection sur les bounding box des geoms avec "st_intersects( box2d(a.geom),box2d(b.geom) )", pour ensuite avec les lignes résultantes, tester l'intersection sur les geom en tant que tel, mais pas vraiment de gain de temps constaté.
Je suppose que st_intersects doit déjà utilisé dans son mécanisme interne, cette optimisation en utilisant la bbox.
Est-ce que ma supposition sur l'intersection sur les bbox est exacte ?
Est-ce que la définition de SRID sur les colonnes geom peut permettre d'optimiser les choses (je n'en ai pas défini pour le moment) ?
Avez-vous une idée pour optimiser ou alors il n'y a rien de plus à faire ?
Merci d'avance pour vos aides/réponses.
Hors ligne
#2 Wed 23 January 2013 18:26
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: [Postgis] Optimisation d'intersection de geom
Bonsoir,
Effectivement, utiliser les BBOX ou l'operateur && est inutile et va faire prendre plus de temps: les prédicats st_* utilisent deja le test sur les bbox.
Les données sont-elles grandes (étendues) par rapport a l'extent général ?
La colonne geo est-elle bien indexée ?
Les tables ont elles ete nettoyées et analysées ? (VACUUM FULL ANALYSE table)
La commande EXPLAIN montre-t-elle l'utilisation des index spatiaux ?
Vous pouvez "clusteriser" la table pour qu'elle soit ordonnée suivant l'index: ca permet souvent un gain de performance.
Postgresql est-il optimisé (postgresql.conf)
Quelle est la conf de la machine.
Il restera ensuite a changer le hardware disques durs surtout.
Nicolas
Hors ligne
#3 Wed 23 January 2013 18:47
- sigdu80
- Participant actif
- Date d'inscription: 2 Sep 2010
- Messages: 112
Re: [Postgis] Optimisation d'intersection de geom
Bonsoir Nicolas,
j'ai lu tes pistes, merci beaucoup.
Je dois y aller, mais demain, j'essaie le VACUUM et l'analyse avec EXPLAIN pour alimenter ma prochaine réponse.
Bonne soirée, à demain.
Hors ligne
#4 Thu 24 January 2013 09:31
Re: [Postgis] Optimisation d'intersection de geom
je dirais que la table parcelle est grande et que son champ id . n'est pas indexe
Hors ligne
#5 Thu 24 January 2013 11:11
- sigdu80
- Participant actif
- Date d'inscription: 2 Sep 2010
- Messages: 112
Re: [Postgis] Optimisation d'intersection de geom
Bonjour Nicolas,
Bonsoir,
Effectivement, utiliser les BBOX ou l'operateur && est inutile et va faire prendre plus de temps: les prédicats st_* utilisent deja le test sur les bbox.
Bien noté
Les données sont-elles grandes (étendues) par rapport a l'extent général ?
C'est à dire ? Peux-tu m'expliquer car je ne sais pas quels infos je dois donner.
La colonne geo est-elle bien indexée ?
Les colonnes geom des 2 tables sont bien indexés, par la méthode d'accès gist. C'est bien la plus appropriée pour un champ de type geometry ?
Les tables ont elles ete nettoyées et analysées ? (VACUUM FULL ANALYSE table)
Oui oui, elles le sont bien.
La commande EXPLAIN montre-t-elle l'utilisation des index spatiaux ?
Oui, tout à fait :
-> Index Scan using idx_gid_infos on infos b (cost=0.00..8.27 rows=1 width=2795)
Index Cond: (a.geom && b.geom)
Vous pouvez "clusteriser" la table pour qu'elle soit ordonnée suivant l'index: ca permet souvent un gain de performance.
Je ne connais pas bien, j'essaie de me renseigner.
Après avoir regardé un 1er article, il s'agirait de mettre dans un cluster, plutôt des tables de référence (des tables où il n'y a pas de fréquente MAJ), donc, cela concernerait la table SQL infos non ?
Postgresql est-il optimisé (postgresql.conf)
Quelle est la conf de la machine.
Il restera ensuite a changer le hardware disques durs surtout.
A vrai dire, je fais des tests sur une machine windows. J'ai augmenté le shared_buffers. Il y a d'autres propriétés qui permettent un gain de vitesse significatif ?
Nicolas
Merci déjà en tous cas, pour toutes ces pistes.
Dernière modification par sigdu80 (Thu 24 January 2013 11:47)
Hors ligne
#6 Thu 24 January 2013 11:17
- sigdu80
- Participant actif
- Date d'inscription: 2 Sep 2010
- Messages: 112
Re: [Postgis] Optimisation d'intersection de geom
Bonjour Vincent,
je dirais que la table parcelle est grande et que son champ id . n'est pas indexe
La table parcelle a pour clé primaire, id.
Implicitement, les clés primaires sont indexées.
La bdd sur laquelle je fais les tests, est minimaliste, je n'ai injecté que 2 parcelles dans la table parcelle, donc elle est quasi vide.
Hors ligne
#7 Thu 24 January 2013 11:52
Re: [Postgis] Optimisation d'intersection de geom
23 secondes pour une jointure de 16K éléments c'est énorme.
Quel genre de géométries on trouve dans la table infos ?
Si ce sont des grosses géométries, avec beaucoup de points, et une étendue large, ou bien des géométries dégénérées (type croissant de lune), alors l'explication se trouve là. Les indexes géométriques dans ce cas sont peu efficaces voire pénalisants, et le calcul d'intersection très long car trop détaillé.
C'est un des cas limite d'utilisation de PostGIS (et du principe d'indexation RTree de façon général).
Solution : découper les géométries infos en sous-éléments plus simples et plus petits, les simplifier (st_simplify) avant le calcul d'intersection.
Hors ligne
#8 Thu 24 January 2013 12:26
- sigdu80
- Participant actif
- Date d'inscription: 2 Sep 2010
- Messages: 112
Re: [Postgis] Optimisation d'intersection de geom
re Vincent,
alors, ce sont des polygones. Ils sont un peu complexe je pense, mais j'ai mis un impr écran issu de QGIS pour que tu puisses dire si c'est complexe ou pas,
[img]http://img51.imageshack.us/img51/4451/tmpcarto.jpg[/img]
Si j'utilise st_simplify, est-ce que cela serait le 1er traitement à faire, pour déterminer les geom qui font intersection ?
Je vais faire une requête pour montrer ce que j'explique en début d'après-midi.
Bon appétit.
[dit modérateur] modification du lien vers l'image.
Dernière modification par Yves (Thu 24 January 2013 12:32)
Hors ligne
#9 Thu 24 January 2013 13:23
Re: [Postgis] Optimisation d'intersection de geom
re Vincent,
alors, ce sont des polygones. Ils sont un peu complexe je pense, mais j'ai mis un impr écran issu de QGIS pour que tu puisses dire si c'est complexe ou pas,
http://img51.imageshack.us/img51/4451/tmpcarto.jpg
Si j'utilise st_simplify, est-ce que cela serait le 1er traitement à faire, pour déterminer les geom qui font intersection ?
Je vais faire une requête pour montrer ce que j'explique en début d'après-midi.
Bon appétit.
[dit modérateur] modification du lien vers l'image.
Le dessin n'est pas très explicite, on ne voit pas bien ce que sont les polygones.
Si ce sont des lits de cours d'eau entiers, c'est effectivement très probable que ce soient des géométries «dégénérées».
Il faut a moins les simplifier, mais surtout les prédécouper avant en des entités plus simples.
Les parcelles n'ont pas non plus l'air d'etre des parcelles cadastrales, donc si elles sont complexes également ça peut empirer les traitements.
v.
Hors ligne
#10 Thu 24 January 2013 13:52
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: [Postgis] Optimisation d'intersection de geom
Ah oui, beaux polygones ;-)
Nicolas
Hors ligne
#11 Thu 24 January 2013 15:23
- sigdu80
- Participant actif
- Date d'inscription: 2 Sep 2010
- Messages: 112
Re: [Postgis] Optimisation d'intersection de geom
Oui Nicolas, j'aime les belles choses donc je fais dans les beaux polygones
J'ai refait un impr écran (j'explique un peu plus juste en dessous) :
[img]http://img838.imageshack.us/img838/1781/tmpcarto2.jpg[/img]
Alors le gros bloc qui était tout violet est la table "infos".
Elle a 3 classes de valeurs différentes. J'ai mis des couleurs différentes (opacité >50%, couleur violette, rose, rose très pâle limite blanc), attention la bande horizontale du haut très rose flashy doit être plus dû à un bug d'affichage de QGIS je pense.
Ma parcelle de test est en bas à droite en vert. Elle est énorme et donc complètement délirante par rapport à la réalité (j'ai dessiné une forme de maison de travers ). Par contre, tu trouves que sa forme est complexe ?
On voit différentes couleurs pour montrer l'intersection de la parcelle avec différentes classes de valeurs de la table infos.
Ce sont des polygones dégénérés tu disais donc.
Dans l'ordre, il faudrait :
- 1) prédécouper les entités générées de la table infos
- 2) utiliser st_simplify dans la requête
1) le shapefile a été transféré par QGIS dans la base postgresql.
Ensuite, j'ai réinjecté dans une table de référence.
Il faudrait que j'efface le contenu de cette table (TRUNCATE) et que je fasse une opération (mais laquelle ? comment pré-découper ?).
2) utiliser le st_simplify au moment du WHERE st_intersects ? -> st_intersects(st_simplify(a.geom,2), st_simplify(a.geom,2)
OU/ET avec st_intersection ?
Dernière modification par sigdu80 (Thu 24 January 2013 15:34)
Hors ligne
#12 Thu 24 January 2013 17:27
Re: [Postgis] Optimisation d'intersection de geom
Salut,
On ne voit toujours pas bien les polygones sur l'image, j'espère juste qu'il n'y en a pas que 3 (un rose, un bleu et un rose pale...).
Mais dans tous les cas le problème vient bien de là. Il faut faire des entités plus petites.
Pour les roses pales, on ne voit pas comment ils sont découpés.
Les polygones bleus n'ont pas l'air si gros que ça, mais il faudrait s'assurer de bien avoir une seule géométrie (et pas un multipolygone avec multi=beaucoup) par enregistrement.
Par contre pour les rose pales, il faut clairement les découper.
On peut le faire de différentes manières, le plus simple étant de le faire avec une grille. Ça reste un ensemble de requetes un peu complexe. Il y a un exemple ici :
http://www.bostongis.com/blog/index.php … stuff.html
Et c'est pas mal détaillé dans le livre «PostGIS in Action».
Ce qu'il faut retenir c'est qu'il est (très) préférable d'avoir beaucoup de petites géométries que peu de très grosses, surtout si ces géométries sont fortement concaves.
Vous devriez également travailler dans un système projeté, les calculs euclidiens en latitude/longitude donnent des résultats aberrants.
Hors ligne
#13 Thu 24 January 2013 17:30
Re: [Postgis] Optimisation d'intersection de geom
... et une fois les géométries réduites, le st_simplify ne devrait pas faire de grosse différence, ce n'est pas la priorité.
Hors ligne
#14 Thu 24 January 2013 18:06
- sigdu80
- Participant actif
- Date d'inscription: 2 Sep 2010
- Messages: 112
Re: [Postgis] Optimisation d'intersection de geom
Le bleu, c'est du violet mais c'est vrai qu'avec l'opacité que j'ai mis, c'est pas flagrant.
Dans la table infos, il y a 8000 lignes.
Au départ, le shapefile avait 3 multipolygones disjoints.
Avec ArcGis, la fonctionnalité "Eclater" a été utilisé pour ne plus avoir d'éléments disjoints.
Utiliser une grille, d'accord, je vais jeter un œil, merci.
Vous devriez également travailler dans un système projeté, les calculs euclidiens en latitude/longitude donnent des résultats aberrants.
Désolé, je n'ai pas compris. J'essaie de m'accrocher
Hors ligne
#15 Fri 25 January 2013 10:23
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: [Postgis] Optimisation d'intersection de geom
Bonjour,
Vincent indiquait qu'il faut bien vérifier que les objets ne soient pas en latitude longitude avant de faire des calculs, mais dans un systeme projeté, pour que les calculs mathématiques soient corrects (espace plan)
Nicolas
Hors ligne
#16 Fri 25 January 2013 19:13
- sigdu80
- Participant actif
- Date d'inscription: 2 Sep 2010
- Messages: 112
Re: [Postgis] Optimisation d'intersection de geom
Bonsoir,
je vais essayer de me documenter un peu, car je ne comprends toujours pas, c'est dû à mon ignorance dans le domaine mais j'essaie de m'améliorer
Je ne suis pas cartographe et je ne maîtrise pas trop les choses j'avoue.
Bon week-end si on ne se répond pas d'ici là.
Hors ligne
#17 Mon 28 January 2013 16:14
- sigdu80
- Participant actif
- Date d'inscription: 2 Sep 2010
- Messages: 112
Re: [Postgis] Optimisation d'intersection de geom
Bonjour,
je commence à lire/traduire/comprendre l'article que m'a conseillé Vincent.
La notion "espace plan" et autres, je dois regarder cela aussi.
J'ai fait aussi une requête pour détecter la classe de valeurs de la table infos, qui demande le plus de temps de calcul.
J'ai fait la requête suivante :
Code:
SELECT id,lower,upper,st_intersection(a.geom, b.geom) FROM parcelles a INNER JOIN infos b ON (st_intersects(a.geom,b.geom) AND b.classe = X) WHERE a.id IN (1,2);
Les temps de réponse :
- couleur violette : 0.157s
- couleur rose : 23.125s
- couleur rose très pâle : 0.094s
Il faudrait sûrement découper (comme vous me le conseilliez la semaine dernière) fortement cette classe de valeur précise, dans la table infos.
Je retourne à ma lecture "map dicing ...".
Dernière modification par sigdu80 (Tue 29 January 2013 10:07)
Hors ligne
#18 Tue 29 January 2013 11:39
- sigdu80
- Participant actif
- Date d'inscription: 2 Sep 2010
- Messages: 112
Re: [Postgis] Optimisation d'intersection de geom
Bonjour,
je me demandais si quelqu'un avait déjà appliqué ce map dicing ?
je suis à l'étape 4 où on doit récupérer le résultat de l'intersection entre les geoms d'une table de référence et d'une table "grille".
Cependant, cela semble mettre un temps fou à se faire.
J'ai crée 2 tables grilles, une de 10*10 et une autre de 100*100. Au bout de quelque minutes, j'ai arrêté la requête lorsque j'ai fait la 1ère table grille. Pour l'instant je laisse tourner celle avec la grille 100*100 (on en est à 700 secondes là).
Avez-vous un ordre de grandeur de temps d'exécution pour ce type de traitement ? (grille 100*100 et moins de 8000enregistrements issus d'une partie de la table de référence (seulement la classe posant des soucis))
Pour la grille 10*10, j'ai 120 000 enregistrements qui font intersection (13sec). Il faut ensuite le geom résultant de chaque intersection, c'est çà qui prend un temps énorme évidemment.
Merci d'avance.
Dernière modification par sigdu80 (Tue 29 January 2013 18:37)
Hors ligne
#19 Tue 19 February 2013 18:00
- sigdu80
- Participant actif
- Date d'inscription: 2 Sep 2010
- Messages: 112
Re: [Postgis] Optimisation d'intersection de geom
Bonjour à tous,
me revoilà sur ce sujet que j'avais dû laissé de côté, ayant d'autres choses à faire à côté.
Je reviens ici pour dire que j'ai réussi ce que je souhaitais : optimiser le temps de calcul d'intersection entre la table infos et parcelles.
Grâce au map dicing que vous m'avez conseillé !
En fait, j'avais mal défini ma bbox de la case d'une grille 10*10, donc forcément, çà ne fonctionnait pas correctement !
J'illustre, çà pourrait peut-être servir à quelque chose à quelqu'un qui sait.
Déjà, j'ai détecté que la complexité des polygones ne provenaient uniquement que d'un seul enregistrement !
Le voici :
[img]http://imageshack.us/a/img543/9943/polygonecomplexe.jpg[/img]
Après avoir revérifier les étapes du map dicing, j'ai vu que j'avais mal fait l'étape 3. J'ai bien fait attention avec la bbox d'une case d'une grille 10*10.
J'ai appliqué la bbox (Xorigine Yorigine,Xorigine+largeur Yorigine+hauteur).
Ce qui donne :
[img]http://imageshack.us/a/img267/4729/coucheetgrille10x10pres.jpg[/img]
On voit qu'il y a un décalage, pourtant j'applique la formule explicitée.
Pour corriger, j'essaie avec :
bbox(Xorigine-largeur Yorigine-hauteur,Xorigine Yorigine)
Ce qui donne :
[img]http://imageshack.us/a/img19/2940/coucheetgrille10x10corr.jpg[/img]
A partir de là, les étapes suivantes s'enchaînent correctement.
La réalisation de la découpe dure plus de 10minutes.
A la fin, on constate que l'on a bien optimisé les choses car je passe de 23.5s à 0.5s.
Le but est atteint !
Bonne fin de journée à tous.
Dernière modification par sigdu80 (Tue 19 February 2013 18:06)
Hors ligne