批量bulk insert 原理不明白之处 求解答

cursor cur_avg_score is  --返回数量有500万行
select c.name,course_name, avg(score)
from
(
  select student_id,name   --6
  from a
  where a.name like '张%'  --4
) c                        --5
inner join                --
(
select b.score,student_id,course_id,course_name
from b
where insert_time >to_date('2012-03-08','YYYY-MM-DD')
) d
on c.student_id=d.student_id
group by c.name,course_name
order by c.name,course_name


open cur_avg_score;  --1
 loop                --3
   fetch cur_avg_score bulk collect into  --2
     l_ary_name,
     l_ary_course,
     l_ary_score
    limit 10000;
    
   forall i in 1..l_ary_name.count
    insert into t_avg_sorce_tmp
    (
       name,course_name,avg_score,create_time,modify_time
       )
    values
    (
     l_ary_name(i),
     l_ary_course(i),
     l_ary_score(i),
     sysdate,
     sysdate
 );
    commit;
   exit when cur_avg_score;notfound or cur_avg_score;notfound is null;             
   end loop;  
   close cur_avg_score;

这是个完整的统计存储过程,当然去掉了变量声明

不明白之初

1 OPEN: 游标 有人道 只是解析并生成执行计划,并且记住SCN号

2  fetch :只是完成提取数据这个操作吗? 还是完成执行计划,并提取数据?

3  loop:  循环bulk时 是不是也不能太大减少SQL引撑的切换? 如果500万数据 普通游标要500万次,而这里有limit 10000; 只需要循环500次,那么是否可以说发生500次PLSQL/SQL引撑切换

3.5  loop fetch 联合操作: 如果fetch要完成执行计划是否每次都要执行一遍呢? 比如上面的语句执行计划  1 全表扫描读进内存; 2 过滤数据; 3表连接 4 分组;5排序;6输出结果

    还是有人说的只要第一次fetch时候才执行执行计划;  如果这样必定需要一个地方存储结果集 那这个地方是哪里? PGA 的哪个区还是DATABUFFER 的临时表空间?


4 过滤: 是把符合记录的行过滤出来,还是把符合记录的块过滤出来?  如果是行将暂时保存在哪里? 不要说PGA

5 子查询的结果存放在哪里?

6 列的过滤是在哪个步骤? 是SELECT 还是   WHERE条件的时候?

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值