Pages: 1
- Sujet précédent - [Spatialite] problème de performance d'une requête spatiale - Sujet suivant
#1 Tue 27 May 2014 14:28
- Lsam
- Participant assidu
- Date d'inscription: 27 Nov 2013
- Messages: 157
[Spatialite] problème de performance d'une requête spatiale
Bonjour,
Je souhaite exécuter la requête spatiale suivante dans ma base Spatialite :
Code:
select "c1"."geometry" from "c1", "c2" where within("c1"."geometry",buffer("c2"."geometry",1000))
Au bout de 36 minutes, toujours pas résultat ! Je ne m'explique pas ce manque de performance.
c1 est une table avec une géométrie de type Point, comprenant 247434 enregistrements
c2 est une table avec une géométrie de type Multipolygon, comprenant 6 enregistrements
Les 2 tables ont un index spatial.
J'ai l'impression que mon passage à la version 4 de Spatialite est à l'origine du problème. Me trompe-je ou quelqu'un aurait une autre idée sur le problème ? Je ne pense pas que ma requête soit si complexe que ça pourtant ?!
Merci
Dernière modification par Lsam (Tue 27 May 2014 17:12)
Hors ligne
#2 Wed 26 April 2017 15:29
- JD
- Moderateur
- Date d'inscription: 8 Aug 2013
- Messages: 726
Re: [Spatialite] problème de performance d'une requête spatiale
Bonjour,
j'arrive un peu tard mais comme ce sujet est sans réponse, je me permets de proposer une réponse.
Plutôt que d'utiliser le buffer, vous pouvez essayer ceci, si vous possédez la fonction PtDistWithin qui dépend de PROJ4:
Code:
select "c1"."geometry" from "c1", "c2" where PtDistWithin("c1"."geometry","c2"."geometry",1000)
Mais surtout pour profitez des index, il peut être intéressant de rajouter une clause.
Sous postgis il s'agit de :
Code:
AND c1.geometry && c2.geometry
Sous spatialite, c'est un peu plus compliqué :
Code:
AND c1.ROWID IN ( SELECT ROWID FROM SpatialIndex WHERE f_table_name = 'c1' AND search_frame = c2.geometry )
qu'on traduit par: parmi les géométries dont l'id est dans la fenêtre de recherche de la géométrie 2.
Donc d'abord, je créerai une table c3 qui est une copie de c2 dont la géométrie est le buffer.
ta requête complète sans la fonction PtDistWithin :
Code:
SELECT"c1"."geometry" from "c1", "c3" WHERE c1.ROWID IN ( SELECT ROWID FROM SpatialIndex WHERE f_table_name = 'c1' AND search_frame = c3.geometry ) AND within("c1"."geometry","c3"."geometry",1000))
Cordialement,
Dernière modification par lejedi76 (Wed 26 April 2017 15:34)
Hors ligne
Pages: 1
- Sujet précédent - [Spatialite] problème de performance d'une requête spatiale - Sujet suivant