#1 Sat 16 May 2020 09:41
- preliator
- Participant assidu
- Date d'inscription: 17 Nov 2018
- Messages: 433
st_dwithin - Problème
Bonjour,
Je dispose d'une table points "PointA" (500 000 points), et d'une seconde table de points "PointB" (73 000 points). Je voudrais faire la somme d'une colonne quantitative située dans "PointB" des points qui se situent à une distance fixe de chacun des points de "PointA". Pour cela, utiliser la clause St_dwithin me paraît être cohérent.
Code:
select pta.id, sum(ptb.ind) somme_pop from pointa pta, pointb ptb where st_dwithin(pta.geom, ptb.geom, 10000) group by pta.id
Malheureusement, la requête dure plus d'une heure pour s'achever (malgré les index spatiaux).
Je me demandais si une syntaxe particulière me permettrait d'aller plus vite...
Merci.
Dernière modification par preliator (Sat 16 May 2020 09:43)
Hors ligne
#2 Sat 16 May 2020 12:28
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: st_dwithin - Problème
Bonjour,
Suivant votre dataset et la répartition des points, 10000m (je suppose que vos données sont en mètres) peut etre une distance énorme: chaque PointA peut matcher beaucoup de pointB => l'index ne sert plus vraiment, il n'est plus assez sélectif car le nombre de candidat à retenir couvre une grande partie de l'index.
Au final, le système réalise des millions, voire centaines de millions de tests de distance et c'est long.
Vous pouvez le vérifier en analysant le plan de la requête (explain <requete>; ) et en regardant les couts; ca ne m'étonnerait pas qu'ils soient enormes dans votre ca (pouvez-vous poster le résultat de ce "explain select pta.id..." ?).
Nicolas
Hors ligne
#3 Sat 16 May 2020 12:39
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: st_dwithin - Problème
Vous avez lancé vacuum analyse <table> après la création des index ?
Nico
Hors ligne
#4 Sat 16 May 2020 12:57
- preliator
- Participant assidu
- Date d'inscription: 17 Nov 2018
- Messages: 433
Re: st_dwithin - Problème
Merci pour votre réponse. Effectivement, il doit y avoir énormément de points qui match, vu la distance de 10000m.
Non, je n'ai pas lancé ce vacuum. Je n'y ai pas pensé.
Merci beaucoup
Hors ligne