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

来源:互联网 发布:数组未赋值,默认为什么 编辑:程序博客网 时间:2024/06/01 09:54
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                        --5inner join                --(select b.score,student_id,course_id,course_namefrom bwhere insert_time >to_date('2012-03-08','YYYY-MM-DD')) don c.student_id=d.student_idgroup by c.name,course_nameorder by c.name,course_nameopen 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条件的时候?

原创粉丝点击