Je voudrais récupérer tous les points dans une plage donnée d'un autre ensemble de points. Disons-nous, trouvons tous les magasins à moins de 500m de n'importe quelle station de métro.
J'ai écrit cette requête, qui est assez lente et souhaite l'optimiser: P>
Unique (cost=2407390.71..2407390.72 rows=2 width=4) (actual time=3338.080..3338.252 rows=918 loops=1) Buffers: shared hit=559 -> Sort (cost=2407390.71..2407390.72 rows=2 width=4) (actual time=3338.079..3338.145 rows=963 loops=1) Sort Key: locations.id Sort Method: quicksort Memory: 70kB Buffers: shared hit=559 -> Nested Loop (cost=0.00..2407390.71 rows=2 width=4) (actual time=2.466..3337.835 rows=963 loops=1) Join Filter: (((pois.coordinates)::geography && _st_expand((locations.coordinates)::geography, 500::double precision)) AND ((locations.coordinates)::geography && _st_expand((pois.coordinates)::geography, 500::double precision)) AND _st_dwithin((pois.coordinates)::geography, (locations.coordinates)::geography, 500::double precision, false)) Rows Removed by Join Filter: 4531356 Buffers: shared hit=559 -> Seq Scan on locations (cost=0.00..791.68 rows=24168 width=36) (actual time=0.005..3.100 rows=24237 loops=1) Buffers: shared hit=550 -> Materialize (cost=0.00..10.47 rows=187 width=32) (actual time=0.000..0.009 rows=187 loops=24237) Buffers: shared hit=6 -> Seq Scan on pois (cost=0.00..9.54 rows=187 width=32) (actual time=0.015..0.053 rows=187 loops=1) Filter: (poi_kind_id = 3) Rows Removed by Filter: 96 Buffers: shared hit=6 Planning time: 0.184 ms Execution time: 3338.304 ms (20 rows)
3 Réponses :
Je pense que vous devriez changer une solution, PostGis exécute toujours une requête dans la base de données structurée, elle est puissante, mais pas rapide dans une exigence particulière, vous pouvez être si vous avez besoin d'élasticsearch. P>
Elasticsearch est bon à la recherche de localisation Geo, mais pas bien au processus de données GEO, je pense que vous en avez besoin à la fois. P>
Merci de votre réponse, mais j'aimerais vraiment coller à Postgres. S'il n'y a aucun moyen de couvrir mes besoins, je vais envisager d'utiliser un moteur de stockage supplémentaire
Les postgis peuvent être très rapides si elle est accordée en conséquence. C'est une extension SIG DB spécialisée de PG
Je pense que vous utilisez la version géographique de ST_DWITHIN, en raison du quatrième paramètre.
essayez de changer votre requête sur celui-ci: p> si ça ne 't résoudre, s'il vous plaît poster l'expliquant analyser à nouveau. p> p>
Suppression du faux paramètre a rendu la requête de la requête 8.6Sec (au lieu de 3 secondsi). Voici la nouvelle explication Analyse: Gist.github.com/cblavier/726139EDA4CD574340BD
Je fini par finir à la conclusion que je ne pouvais pas vivre - une distance de calcul entre des milliers de points d'intérêt et des milliers d'emplacements dans un délai réaliste (<1sec).
Donc, j'ai donc précompute tout: chaque fois qu'un emplacement Ou un POI est créé / mis à jour, je stocke la distance minimale entre chaque emplacement et chaque type de POI afin de pouvoir répondre à la question "Quels emplacements sont plus proches que x mètres de ce type de POI". P> < p> Voici le module que j'ai codé à cette fin (c'est dans Elixir, mais la partie principale est la SQL brut) p>
Sont-ils la géométrie ou la géographie?
wiki.postgresql.org/wiki/slow_query_Questions
@ FrancescoD'alesio géométrie
Utilisez-vous un système de coordonnées métriques? Le résultat est-il lent mais correct?
@ FrancescoD'alesio Oui c'est un système métrique. Oui Le résultat actuel est correct mais trop lent (environ 3 secondes pour correspondre à 100 000 magasins avec 200 stations de métro)
J'ai supprimé ma réponse, car c'était faux.
st_dwithin () code>
devrait pouvoir utiliser les index spatiaux dans n'importe quel Cas. Veuillez fournir la sortie deexpliquer (analyser, tampons) code>. Aussi vos numéros de version réels i>. La version "la plus récente" est soumise à une pourriture de bits. Je soupçonne que vous venez d'obtenir beaucoup i> de résultats. 200 stations de métro, rayon de 500 mètres ... pourraient revenir beaucoup i>.
Ça ne devrait pas prendre autant de temps ..
J'essaierais d'écrire des coordonnées X et Y dans un col de précision double, puis essayez d'obtenir des résultats à l'aide d'une requête Bbox comme x> Minx et x
Après l'analyse expliquée bien sûr! :)
Ok les gars, je viens d'ajouter l'analyse expliquée! :)