背景
PostgreSQL 提供的递归语法是很棒的,例如可用来解决树形查询的问题,解决Oracle用户 connect by的语法兼容性。
请参考
https://yq.aliyun.com/articles/54657
但是如果参与递归查询的数据集有问题,例如数据打结的问题。则会导致递归死循环,可能导致临时文件暴增,把空间占满,影响业务。
案例
假设c1,c2是上下级关系,c2是c1的上级ID。
创建测试表如下
create table test(c1 int, c2 int, info text);
create index idx_test_01 on test(c1);
create index idx_test_02 on test(c2);
插入一组测试数据,其中(1,1,'test')是个结,如果用递归查询的话,会导致无法退出循环。
insert into test values
(9,8,'test'),
(8,7,'test'),
(7,6,'test'),
(6,5,'test'),
(5,4,'test'),
(4,3,'test'),
(3,2,'test'),
(2,1,'test'),
(1,1,'test');
递归查询,从c1=9开始往上检索,到1之后会一直往下走,无法终结。