Mam tabelę PostgreSQL, z prawie 2 milionami wierszy, z długim coordinates
polem w formie POINT(-73.4938 33.2405)
.
Załóżmy, że istnieje indeks geoprzestrzenny na tym polu, jaki jest najbardziej wydajny i najszybszy sposób na zaznaczenie wszystkich wierszy w dowolnym polu ograniczającym?
Pudełko jest niczym SW long-lat: -74.0042 40.7688
, NE long-lat: -73.8809 40.7984
.
postgis
performance
geography-data-type
Avishai
źródło
źródło
Odpowiedzi:
Zakładając, że podane granice ramki granicznej znajdują się w tym samym systemie odniesienia przestrzennego, co zapisane współrzędne, i wiesz, którego operatora przestrzennego (przecina lub zawiera) potrzebujesz:
Alternatywnie, jeśli wolisz dźwięk „zawiera” (zamiast „zawiera”),
WHERE
klauzula powinna zostać odwrócona:PS: Biorąc pod uwagę (przez OP po opublikowaniu powyższego), że rekordy są prostymi punktami, myślę, że różnica między „przecięciami” a „ograniczeniem” staje się bardzo subtelna, wpływając tylko na punkty na krawędzi ramki ograniczającej.
źródło
What's the fastest ...?
: OP&&
i@
wydaje się, że nie działa, gdy przecina się z geometrią wielokąta. W takim przypadku użyjST_Intersects(latlng_column,ST_GeomFromText('Polygon ((...))',4326))
lub alternatywnieST_Contains
źródło
Najwyraźniej nie mam wystarczającej liczby punktów, aby dodać komentarz, więc używam tej odpowiedzi tylko po to, aby powiedzieć, że wypróbowałem zarówno ST_MakeEnvelope vs. ..średnio ST_MakeEnvelope zajęło 60 ms, a porównanie matematyki zajęło 155 ms dla mojego konkretnego zapytania bbox.
Tak więc wyszukiwanie przestrzenne ST_MakeEnvelope powinno być szybsze niż porównanie matematyki!
źródło
INDEX
w ST_MakeEnvelope, jak i (ST_XMax, ST_XMin, ST_YMax, ST_YMin), a różnica jest bardzo korzystna dla matematyki. Matematyka zajęła mi mniej niż 20 sekund (INDEKS + zapytanie), podczas gdy przecięcie kopert zajęło 2 minuty (poddałem się, gdy osiągnęło 2