Предотвратить бесконечный цикл в рекурсивном запросе в Postgresql - PullRequest
0 голосов
/ 25 июня 2018

Извините - это немного расплывчато ...

Здесь: ( Чтобы найти бесконечный рекурсивный цикл в CTE ) - обсуждение того, как предотвратить бесконечный цикл в рекурсивном запросе. Там рекурсия предотвращена на «уровне запроса» - по крайней мере, в ответе о Postgresql.

Есть ли способ в Postgresql (10) реализовать какую-то сеть безопасности для предотвращения бесконечных рекурсий? Это реальный способ использования statement_timeout для этого или есть какой-либо другой общепринятый способ?

1 Ответ

0 голосов
/ 12 июля 2018

В моей среде разработки я всегда использую два предохранителя в отношении рекурсивных запросов или функций.Мой клиент автоматически устанавливает при запуске

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, очевидно, очень эффективен, также в производственной среде, но его не всегда можно использовать (или он слишком дорогой).

...