J'ai une table PostgreSQL, avec près de 2 millions de lignes, avec un coordinates
champ long-lat dans le formulaire POINT(-73.4938 33.2405)
.
En supposant qu'il existe un index géospatial sur ce champ, quel est le moyen le plus efficace et le plus rapide pour sélectionner toutes les lignes dans un cadre de sélection arbitraire?
La boîte est comme SW long-lat: -74.0042 40.7688
, NE long-lat: -73.8809 40.7984
.
Réponses:
En supposant que les limites du cadre de délimitation données se trouvent dans le même système de référence spatiale que les coordonnées stockées et que vous savez de quel opérateur spatial (intersecté ou contenu par) vous avez besoin:
Alternativement, si vous préférez le son de "contient" (au lieu de "contenu par"), la
WHERE
clause doit être inversée:PS: Étant donné (par OP après la publication de ce qui précède) que les enregistrements sont de simples points, je pense que la différence entre "intersections" et "confinement" devient très subtile, n'affectant que les points sur les bords de la boîte englobante.
la source
What's the fastest ...?
: OP&&
et@
ne semble pas fonctionner lors de l'intersection avec la géométrie du polygone. Dans ce cas, utilisezST_Intersects(latlng_column,ST_GeomFromText('Polygon ((...))',4326))
ou alternativementST_Contains
la source
Apparemment, je n'ai pas assez de points pour ajouter un commentaire, donc j'utilise cette réponse juste pour dire que j'ai essayé à la fois ST_MakeEnvelope et la comparaison mathématique de "x> min_x et x <max_x et y> min_y et y <max_y". ..en moyenne, ST_MakeEnvelope a pris 60 ms et la comparaison mathématique a pris 155 ms sur ma requête bbox particulière.
La recherche spatiale ST_MakeEnvelope devrait donc être plus rapide que les mathématiques ne le comparent!
la source
INDEX
sur ST_MakeEnvelope et (ST_XMax, ST_XMin, ST_YMax, ST_YMin) et la différence est très favorable aux mathématiques. Les mathématiques m'ont pris moins de 20s (INDEX + Query) tandis que l'intersection d'enveloppe a pris plus de 2min (j'ai abandonné quand elle a atteint 2min, 40s seulement pour l'indexation spatiale)