Je construis une application qui est censée interroger et renvoyer chaque élément Record
dans une table à des X
kilomètres de distance PointX
. Records
et PointX
les positions de sont déterminées à partir des (long/lat)
informations fournies par l'API Google Geocode.
Je suis nouveau sur PostGIS. Après une recherche rapide, j'ai trouvé cette question . La réponse semble aller dans le sens de:
SELECT *
FROM your_table
WHERE ST_Distance_Sphere(the_geom, ST_MakePoint(your_lon,your_lat)) <= radius_mi * 1609.34
Le problème est: même si je ne fais que commencer au SIG, quand je regarde la requête ci-dessus, je ne peux pas imaginer comment cela peut utiliser un index. Il y a 2 appels de fonction. J'imagine la table en cours d' analyse pour chaque Record
. Je veux me tromper :)
Question: PostGIS possède-t-il un type d'index capable de rendre la requête ci-dessus performante? Sinon, quelle serait l'approche recommandée pour faire ce dont j'ai besoin?
la source
ST_SetSRID()
à laST_MakePoint
conversion avant la géographie dans la requête.Réponses:
Il existe deux clés pour obtenir de bonnes performances de requête géodésique avec de grandes tables avec des
geometry
colonnes utilisant les données géographiques WGS 1984 (SRID 4326):ST_DWithin
fonction, qui recherche en utilisant un index spatial disponible, et trouvera des entités géographiques avec une distance cartésienneST_DWithin
pouvez donc l' utiliserVoyons donc ce qui se passe dans le monde réel. Nous devons d'abord créer et remplir un tableau d'un million de points aléatoires:
Si nous exécutons la requête ST_Distance, nous obtenons votre analyse complète de table attendue:
Maintenant, si nous utilisons
ST_DWithin
, nous obtenons toujours une analyse complète de la table (quoique plus rapide):Et ceci est la dernière pièce - Construire l'indice de couverture (géographie moulée):
Enfin, l'optimiseur utilise l'index spatial, et cela se voit, mais quels sont les trois ordres de grandeur entre amis?
Quelques mises en garde:
Je suis un nerd de base de données, donc mon PC domestique a 16 Go de RAM, six cœurs de 3,3 GHz et un SSD de 256 Go pour l'espace de table par défaut de la base de données; Votre kilométrage peut varier
J'ai relancé le SQL de création avant chaque requête, pour niveler le terrain de jeu par rapport aux pages "chaudes" dans le cache, mais cela pourrait produire des résultats légèrement différents car la même graine aléatoire n'a pas été utilisée pour différentes exécutions
Et une note:
la source