PostgreSQL 递归死循环案例及解法

背景

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之后会一直往下走,无法终结。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值