#1 Wed 15 March 2017 12:28
- MonsieurJ
- Participant occasionnel
- Lieu: Montpellier
- Date d'inscription: 8 Dec 2016
- Messages: 28
[PostgreSQL/PostGIS] Optimisation d'une requête SQL
Bonjour tout le monde,
Je vous explique mon problème, je dois réaliser un découpage d'un résultat de classification spectrale par un ensemble de polygone. Pour réaliser ça, j'avais en amont découpé l'image à classifié selon l'emprise de ces polygones (couche vecteur rassembler en un seul multipolygo pour réaliser le découpage) mais ils sont parfois (souvent) sous-découpé (ou alors plusieurs polygone sont collé, selon la manière dont vous voulez le voir).
En gros une zone découpé de mon image ressemblant à un carré est généralement faite à partir de plusieurs polygones quelconques rassemblés. Mon but étant de découper le résultat (vectoriser) de ma classification selon ces polygones quelconques et non pas selon les rassemblement (comme le résultat de la classification l'est)
Vous me suivez toujours ?
Tout ceci ce trouve dans une base postgreSQL/PostGIS, et j'aimerai faire ça en SQL et non pas avec un logiciel de SIG.
Les tables sont :
- polygone_de_decoupage (2171 tuples)
- resultat_de_scp (1.073.930 tuples)
(J'ai fais une validation de topologie en amont.)
Pour réaliser ce découpage j'ai créé ce script :
Code:
CREATE TABLE resultat_de_scp_decoupe AS ( SELECT a.e_id, b.c_id, ST_CollectionExtract(ST_INTERSECTION (a.geom, b.geom), 3) AS geom FROM polygone_de_decoupage AS a, resultat_de_scp AS b );
La requête me permet bien d'avoir le résultat escompté,quand je la test sur un nombre de tuple plus réduit, mais quand c'est sur l’échantillon total, elle s’arrête après plus de 24h d’exécution pour cause de surcharge du disque dur, alors que celui-ci à un peu plus de 700Go d'espace libre.
Je cherche donc un peu d'aide concernant l'optimisation de cette requête.
Merci d'avance pour les réponse.
Hors ligne
#2 Wed 15 March 2017 13:57
Re: [PostgreSQL/PostGIS] Optimisation d'une requête SQL
Bonjour,
une clause
Code:
WHERE ST_INTERSECTS (a.geom, b.geom)
accélérera grandement la calcul (penser à indexer les colonnes géométriques)
Dans votre calcul, PostgreSQL calcule 2171 x 1073930 intersections, même si celles-ci n'ont pas lieu d'être calculées.
J'en profite pour déplacer ce message dans le forum GeoBD.
Mathieu BOSSAERT
Association GeoRezo
Hors ligne
#3 Wed 15 March 2017 14:40
- MonsieurJ
- Participant occasionnel
- Lieu: Montpellier
- Date d'inscription: 8 Dec 2016
- Messages: 28
Re: [PostgreSQL/PostGIS] Optimisation d'une requête SQL
Merci Mathieu,
Merci pour l'aide sur la requête, quatre mots vienne de me sauver. Merci pour le déplacement en bonne section aussi, désolé je n'ai pas encore incorporer toutes les section du forum.
Hors ligne
#4 Wed 15 March 2017 16:17
- JP LLORENS
- Participant assidu
- Date d'inscription: 12 Nov 2008
- Messages: 231
Re: [PostgreSQL/PostGIS] Optimisation d'une requête SQL
Bonjour.
Je suppose que l''ajout de l'opérateur && pour tester les bounding box avant le st_intersects devrait permettre de gagner du temps
Code:
WHERE a.geom&&b.geom and ST_INTERSECTS (a.geom, b.geom)
Cordialement
JP
Hors ligne
#5 Wed 15 March 2017 16:33
- JP LLORENS
- Participant assidu
- Date d'inscription: 12 Nov 2008
- Messages: 231
Re: [PostgreSQL/PostGIS] Optimisation d'une requête SQL
Correction :
le st_intersects teste déjà les bounding box.
L'opérateur && n'apporte donc rien !
J'aurais du relire la doc avant de répondre. Désolé !
JP
Hors ligne