Обернутая функция PostGIS действительна, но никогда не возвращается - PullRequest
0 голосов
/ 09 апреля 2019

Я пытаюсь создать функцию, которая будет возвращать ближайшую ванную комнату - из-за некоторых ограничений она должна быть в функции, которая возвращает значения SETOF.Мне удалось заставить функцию сделать это, но когда я запускаю ее со значением, оно никогда не возвращается.

При этом внутренний запрос сам по себе возвращает просто отлично ...

Вот функция, которую я создал:

CREATE OR REPLACE FUNCTION nearest_bathroom(tag integer, max_distance decimal = 0.1 )
RETURNS SETOF bathrooms AS $$
SELECT bathroom.*
FROM bathroom
WHERE bathroom.id IN
(
        SELECT broom.id
        FROM bathroom broom
          INNER JOIN location l
          ON _st_dwithin(broom.geom, l.geom, max_distance)
        WHERE l.tag = tag
        ORDER BY st_distance(broom.geom, l.geom)
        LIMIT 1
)
$$ LANGUAGE sql STABLE;

Между тем, выполнение запроса вне функции (SELECT bathroom.* и т. Д.) Со значением для tag работает нормально и возвращает в миллисекундах.

Я должен добавить, что вижу ту же проблему при создании функции, которая RETURNS TABLE (etc, ) вместо SETOF.

Ответы [ 2 ]

0 голосов
/ 09 апреля 2019

Обнаружена проблема - по какой-то причине именованные параметры не оценивались. Переключение использования моей переменной на $ 1, $ 2 и т. Д. Исправило это - что также исправило тайм-аут, вызванный попыткой запустить функции расстояния на огромном неограниченном декартовом.

0 голосов
/ 09 апреля 2019

Во-первых, вы должны использовать st_dwithin, а не _st_dwithin. Последняя функция не может использовать индекс.

Затем убедитесь, что столбец геометрии на большей таблице имеет индекс GiST.

Если обе таблицы большие, производительность никогда не будет высокой, потому что единственной стратегией объединения для такого объединения являются вложенные циклы.

Как уже говорилось, вам нужно избавиться от внешнего запроса.

...