Вот мой запрос:
SELECT 1
FROM post po
WHERE ST_DWithin(po.geog, (SELECT geog FROM person WHERE person.person_id = $1), 20000 * 1609.34, false)
ORDER BY post_id DESC
LIMIT 5;
А вот EXPLAIN ANALYZE
:

У меня есть индекс на все, поэтому я не уверен, почему это медленно. Первые 5 сообщений при сортировке по post_id DESC
удовлетворяют условию, поэтому разве это не должно возвращаться мгновенно?
Я заметил, что если я заменю вызов ST_DWithin на вызов ST_Distance, он запускается мгновенно, например так:
SELECT 1
FROM post po
WHERE ST_Distance(po.geog, (SELECT geog FROM person WHERE person.person_id = $1)) < 20000 * 1609.34
ORDER BY post_id DESC
LIMIT 5;
Этот работает за .15
миллисекунд. Итак, простое решение состоит в том, чтобы просто заменить вызов ST_DWithin на вызов ST_Distance, нет?
Ну, к сожалению, нет, потому что не всегда совпадают первые 5 строк. Иногда он должен сканировать глубоко внутри таблицы, поэтому в этот момент ST_DWithin лучше, потому что он может использовать географический индекс, а ST_Distance не может.
Я думаю, что это может быть проблемой путаницы в планировщике запросов postgres? Мол, по какой-то причине он думает, что ему нужно выполнить сканирование всей таблицы, несмотря на то, что предложение ORDER BY x LIMIT 5
находится спереди и по центру? Не уверен ..