banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Tue 29 June 2021 12:58

Sylvain M.
Participant assidu
Lieu: Saint-Pierre-des-Nids (53)
Date d'inscription: 8 Sep 2005
Messages: 995

Spatialite : performance d'une jointure spatiale

Salut à tous,
Je fais, dans une BD Spatialite, des stats de points (180 000) qui intersectent 2 couches de polygones (env 2000 entités chacune).

Ma requête s’exécute en 20 min, mais comme je modifie les données et que je la relance souvent, je voudrais optimiser, si possible, le temps de calcul.

Voici un extrait de la requête :

Code:

SELECT    count(tpts.id) nbpts,
        avg(tpts.champ) as champ_moyenne,
        ...
FROM    table_polygones1 tplg1
LEFT JOIN    table_points tpts ON ST_Intersects(tplg1.geom, tpts.geom)
LEFT JOIN    table_polygones2 tplg2 ON ST_Intersects(tpts.geom, tplg2.geom)

Toutes mes tables ont un index spatial (créé via SELECT CreateSpatialIndex('table', 'geom'); )

Pensez-vous possible d'optimiser la jointure spatiale entre les tables ?

J'ai pas encore bien assimilé les notions/possibilités de RTreeIntersects() : ça vaut le coup que je creuse de ce côté là selon vous ?

Dernière modification par Sylvain M. (Tue 29 June 2021 12:59)


Sylvain M.

Hors ligne

 

#2 Tue 29 June 2021 23:43

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 Jul 2010
Messages: 1160

Re: Spatialite : performance d'une jointure spatiale

Salut,

si j'ai bien compris ce que vous voulez faire avec votre requête,
peut être que vous gagnerez du temps comme ceci :

Code:

SELECT
   *
FROM
   (SELECT
        tpts.id,
        count(tpts.id) nbpts,
        avg(tpts.champ) as champ_moyenne,
     FROM
       table_points tpts
    JOIN  
         table_polygones1  tplg1
    ON 
         ST_Intersects(tplg1.geom, tpts.geom)
     ) t1
JOIN
   (SELECT
        tpts.id,
        count(tpts.id) nbpts,
        avg(tpts.champ) as champ_moyenne,
     FROM
       table_points tpts
    JOIN  
         table_polygones2  tplg2
    ON 
         ST_Intersects(tplg2.geom, tpts.geom)
     ) t2  
ON
   t1.id = t2.id
.
.
.
.

L'idée étant de réduire le nombre de combinaison.

Hors ligne

 

Pied de page des forums

Powered by FluxBB