Hallo Mulone
По поводу вашей проблемы с псевдонимом Лютер прав.
У медленного запроса есть две причины.
Во-первых, вы преобразовываете каждую точку, чтозанимает время
Второе и, возможно, более важное значение, вы должны использовать ST_Dwithin вместе с пространственным индексом вместо использования расстояния в предложении where.
ST_Dwithin использует пространственные индексы для сортировки большого количества вычислений,
Но проекция ваших данных для выполнения этих расчетов даст вам очень неточные ответы.Почему бы не использовать вместо этого функции географии.
try:
SELECT d, name
(
SELECT ST_Distance(a.way,b.geom) as d, a.name from
(SELECT way::geography, name from ga_osm_latlong_polygon) a,
(SELECT 'POINT(-6.2222 53.307)'::geography as geom) b
where ST_DWithin(a.way, b.geom, 1000)
) c
order by d, name;
Но я думаю, что я написал бы это более просто как:
SELECT ST_Distance(a.way,b.geom) as d, a.name from
(SELECT way::geography, name from ga_osm_latlong_polygon) a,
(SELECT 'POINT(-6.2222 53.307)'::geography as geom) b
where ST_DWithin(a.way, b.geom, 1000)
order by ST_Distance(a.way,b.geom), name;
Но первая версия могла быбудь быстрее, потому что избегая двойного запуска ST_Distance.
Но чтобы это работало хорошо, конечно, тебе понадобится пространственный индекс. Теперь, когда я пишу его, я понимаю, что приведение к географии может быть показательным моментом для индекса.Если это так, я бы посоветовал вам сделать вместо этого столбец географии и создать соответствующий индекс.Рабочий индекс имеет значение как день и ночь.
Обновление: Или, возможно, вы можете создать индекс непосредственно с типом географии.Я не пробовал, но, возможно, стоит попробовать: вот так:
Create index idx_polygon_geog
on ga_osm_latlong_polygon
using gist(way::geography);
HTH
Никлас