数据库树型结构中获取目录串的高性能方法,sys_connect_by_path与自定义函数性能对比

背景:
假设有如下文件夹表T_FOLDER,其DDL语句如下,根据文件夹主键ID获取此文件夹所在的目录串(格式为/id1/id2)?
create table t_folder
(
id number(15) primary key,
name varchar2(32),
parent_id number(15)
);
注:parent_id表示文件夹的父文件夹,parent_id为0表示根文件夹,根文件夹不在表T_FOLDER中存储

数据准备(500万):
insert into t_folder(id, name, parent_id) values(1, 'name_1', 0);
insert into t_folder(id, name, parent_id) values(2, 'name_2', 0);
insert into t_folder(id, name, parent_id) values(3, 'name_3', 0);
insert into t_folder(id, name, parent_id) values(4, 'name_4', 2);
insert into t_folder(id, name, parent_id) values(5, 'name_5', 2);
insert into t_folder(id, name, parent_id) values(6, 'name_6', 3);
insert into t_folder(id, name, parent_id) values(7, 'name_7', 4);
commit;

declare
begin
  for i in 8 .. 5000000 loop
    insert into t_folder (id, name, parent_id) values (i, 'name_' || i, 4);
    if i mod 8 = 0 then
      commit;
    end if;
  end loop;
end;
/

方法一:(208.422(s))
select sys_connect_by_path(id, '/')
  from t_folder
 where id=7
 start with parent_id = 0
connect by prior id = parent_id;

方法二:(0.047(s))
create or replace function f_folder_dir(v_id number) return varchar2 is
  v_parent_id  number;
  v_folder_dir varchar2(4000) := '/' || v_id;
  v_tmp_id     number := v_id;
begin
  loop
    select parent_id into v_parent_id
      from t_folder
     where id = v_tmp_id;
    exit when v_parent_id = 0;
    v_tmp_id := v_parent_id;
    v_folder_dir := '/' || v_parent_id || v_folder_dir;
  end loop;
  return v_folder_dir;
end;
/
-- 采用f_folder_dir自定义函数, 产生目录串,耗时: 0.047(s)
select f_folder_dir(7) from dual;

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值