防止Postgresql中递归查询中的无限循环
Prevent infinite loop in recursive query in Postgresql
抱歉 - 这有点含糊...
这里:()讨论了如何防止递归查询中的无限循环。 "query level" 上的递归被阻止了——至少在关于 Postgresql 的回答中是这样。
在 Postgresql (10) 中有没有办法实现某种安全网来防止无限递归?为此使用 statement_timeout
是一种可行的方法还是有其他被广泛接受的方法?
在我的开发环境中,我总是使用两个熔断器来进行递归查询或函数。我的客户端在启动时自动设置
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) 的值调整为操作系统 and/or 硬件的预期需求和功能。
显然很有效,在生产环境中也是如此,但是不能一直用(或者说太贵了)。
抱歉 - 这有点含糊...
这里:(
在 Postgresql (10) 中有没有办法实现某种安全网来防止无限递归?为此使用 statement_timeout
是一种可行的方法还是有其他被广泛接受的方法?
在我的开发环境中,我总是使用两个熔断器来进行递归查询或函数。我的客户端在启动时自动设置
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) 的值调整为操作系统 and/or 硬件的预期需求和功能。