在Postgresql中防止递归查询中的无限循环

时间:2018-06-25 14:14:35

标签: postgresql common-table-expression recursive-query

对不起-这有点含糊...

此处:(To find infinite recursive loop in CTE)讨论了如何防止递归查询中的无限循环。在那里,至少在有关Postgresql的答案中,在“查询级别”上阻止了递归。

Postgresql(10)中是否有一种方法可以实现某种安全网以防止无限递归?为此使用statement_timeout是一种可行的方法还是还有其他广泛接受的方法?

1 个答案:

答案 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显然在生产环境中也非常有效,但是不能总是使用(或者价格太贵)。