Я создаю приложение, которое должно запрашивать и возвращать каждый Record
в таблице, в X
километрах от PointX
. Records
и PointX
позиции определяются на основе (long/lat)
информации, предоставленной Google Geocode API.
Я новичок в PostGIS. После быстрого исследования я нашел этот вопрос . Ответ, кажется, имеет вид:
SELECT *
FROM your_table
WHERE ST_Distance_Sphere(the_geom, ST_MakePoint(your_lon,your_lat)) <= radius_mi * 1609.34
Проблема в том, что, хотя я только начинаю работать с ГИС, когда я смотрю на приведенный выше запрос, я не могу себе представить, как можно использовать индекс. Есть 2 функциональных вызова. Я представляю таблицу, сканируемую для каждого Record
. Хочу ошибаться :)
Вопрос: Есть ли у PostGIS какой-либо индексный тип, способный обеспечить выполнение вышеупомянутого запроса? Если нет, то какой подход рекомендовал бы делать то, что мне нужно?
postgis
postgresql
andrerpena
источник
источник
ST_SetSRID()
к немуST_MakePoint
перед приведением к географии в запросе.Ответы:
Есть два ключа к получению хорошей производительности геодезических запросов с большими таблицами со
geometry
столбцами, использующими географические данные WGS 1984 (SRID 4326):ST_DWithin
функцию, которая выполняет поиск с использованием доступного пространственного индекса и находит географические объекты с декартовым расстоянием.ST_DWithin
можете использовать егоИтак, давайте посмотрим, что происходит в реальном мире. Сначала нам нужно создать и заполнить таблицу из миллиона случайных точек:
Если мы выполним запрос ST_Distance, мы получим ожидаемое полное сканирование таблицы:
Теперь, если мы используем
ST_DWithin
, мы все равно получаем полное сканирование таблицы (хотя и более быстрое):И это последняя часть - Построение индекса покрытия (география броска):
Наконец, оптимизатор использует пространственный индекс, и он показывает, но каковы три порядка величины между друзьями?
Некоторые предостережения:
Я ботаник базы данных, поэтому мой домашний ПК имеет 16 ГБ ОЗУ, шесть ядер 3,3 ГГц и SSD 256 ГБ для табличного пространства по умолчанию для базы данных; Ваш пробег может варьироваться
Я перезапускал создание SQL перед каждым запросом, чтобы выровнять игровое поле по отношению к «горячим» страницам в кеше, но это могло привести к немного отличающимся результатам, потому что одно и то же случайное начальное число не использовалось для разных запусков
И примечание:
источник