#sql #postgresql #postgis #exists
#sql #postgresql #postgis #существует
Вопрос:
У меня есть эта таблица в postgres:
id | id_datetime | longitude | latitude
-------- --------------------- --------------------- --------------------
639438 | 2018-02-20 18:00:00 | -122.3880011217841 | 37.75538988423265
639439 | 2018-02-20 20:30:00 | -122.38756878451498 | 37.760550220844614
639440 | 2018-02-20 20:05:00 | -122.39640513677658 | 37.76130039041195
639441 | 2018-02-24 10:00:00 | -122.45819139221014 | 37.724317534370066
639442 | 2018-02-10 09:00:00 | -122.44693382058489 | 37.77000760474354
Мне нужен вывод со всеми идентификаторами differents, который имеет по крайней мере другой идентификатор между последними 15 минутами и между 1000 метрами (географическое расстояние).
В моей таблице более 100 тыс. строк. Итак, в настоящее время я пытаюсь выполнить следующий запрос, который работает, но занимает слишком много времени. Есть ли какие-либо шаги, которые я могу предпринять для оптимизации этого?
SELECT DISTINCT
x.id
FROM table x
WHERE EXISTS(
SELECT
1
FROM table t
WHERE t.id <> x.id
AND (t.id_datetime between x.id_datetime - interval '15 minutes' AND x.id_datetime)
AND (ST_Distance((geography(ST_MakePoint(x.longitude, x.latitude))),
geography(ST_MakePoint(t.longitude, t.latitude)) ) <= 1000)
)
Комментарии:
1. Как индексируются ваши таблицы? Если они не проиндексированы, то с этого и нужно начинать. См . use-the-index-luke.com для хорошего руководства о том, почему индексы имеют значение. Кроме того, сколько времени занимает запрос и сколько времени вы ожидаете, что он займет?
2. Спасибо. Я не знал об индексе. Я создал его, и время действительно улучшилось.
3. Затем вы можете создать пространственный индекс (и почему бы не сохранить географию непосредственно одновременно) и использовать
ST_Dwithin
вместоST_Distance
, поскольку первый может использовать пространственный индекс