В моей среде разработки я всегда использую два предохранителя в отношении рекурсивных запросов или функций.Мой клиент автоматически устанавливает при запуске
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) в соответствии с ожидаемыми потребностями и возможностями операционной системы и / или аппаратного обеспечения.
Метод, описанный a_horse_with_no_name, очевидно, очень эффективен, также в производственной среде, но его не всегда можно использовать (или он слишком дорогой).