对不起-这有点含糊...
此处:(To find infinite recursive loop in CTE)讨论了如何防止递归查询中的无限循环。在那里,至少在有关Postgresql的答案中,在“查询级别”上阻止了递归。
Postgresql(10)中是否有一种方法可以实现某种安全网以防止无限递归?为此使用statement_timeout
是一种可行的方法还是还有其他广泛接受的方法?
答案 0 :(得分:1)
在我的开发环境中,我总是使用两个与递归查询或函数有关的保险丝。我的客户在启动时自动设置
set statement_timeout to '10s'
我很少需要更多东西,而且经常使我免于死循环。
当我从头开始编写递归查询时,我总是使用附加列,该列限制了涉及的级别数,如下所示:
with recursive cte (root, parent, depth) as (
select id, parent_id, 1
from ...
union all
select c.id, t.parent_id, depth+ 1
from ...
where depth < 10
)
select *
from cte;
在生产中,这两种方式都可能会出现问题。相反,您可以将配置参数max_stack_depth (integer)的值调整为操作系统和/或硬件的预期需求和功能。
The method described by a_horse_with_no_name显然在生产环境中也非常有效,但是不能总是使用(或者价格太贵)。