我正在尝试创建一个函数,该函数会将最近的洗手间返回到某个位置-由于某些限制,它必须位于返回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
的函数时,我会遇到相同的问题。
答案 0 :(得分:0)
首先,您应该使用st_dwithin
而不是_st_dwithin
。后一个函数不能使用索引。
然后确保较大表上的geometry列具有GiST索引。
如果两个表都很大,那么性能将永远不会很好,因为这种连接的唯一连接策略是嵌套循环。
正如粘性的所说,您应该摆脱外部查询。
答案 1 :(得分:0)
发现了问题-由于某些原因,未评估命名参数。将我的变量用法切换为$ 1,$ 2等可解决此问题-这也修复了由于尝试在巨大的无限笛卡尔坐标上运行距离函数而导致的超时。