oracle 树查询

一、基本用法

语法:select…start with…connect by…prior

eg. 

1、查出所有子节点

select * from addr a connect by prior a.id=a.parentid start with a.id='3484618'

2、查出所有父节点

select * from addr a connect by prior a.parentid=a.id start with a.id='3484618'

两个语句的 prior位置不同。1表示根据id找出 parentid为id 的记录。2表示根据 parentid 找出 id 为parentid的记录。

二、效率问题

ORACLE递归如果向上递归是没有问题的,因为向上递归都是每次唯一性索引,最多根据层数做不同次数的唯一性索引,这也是很快的。

但是向下递归会比较慢,特别是在数据量大的情况下。因为向下递归是根据当前的节点编号去查找是否有相同的PARENT_ID编号,会找到很多,而且下一轮是将这每一个PARENT_ID再看有没有PARENT_ID有没有,全部存入缓存,肯定会装不下,就开始用临时表空间,就更慢了。

对于递归查询,目前找到的几个优化方法有:

1、创建索引,确保语句中的索引有效。

2、增加一个存储了所有父节点 all_parent_id的字段,直接通过all_parent_id去模糊查询得到子节点;参考资料:http://bbs.csdn.net/topics/340184712

3、如果项目需求允许,可以采用逐级查询的方式。即先查询展示出父节点,再根据父节点查询其下的子节点,而不用一次查询出所有节点。

4、数据很大的话,可以考虑分区表。

5、如果树不经常改动,使用 xml方式存储,而不是存储在数据库中。

6、避免使用connect by的查询,如果无法避免,那么尽可能地减小connect by查询的输入数据集规模,因为connect by查询始终对输入数据集进行全扫描




三、参考资料

http://www.cnblogs.com/linjiqin/archive/2013/06/24/3152674.html


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值