ITPUB论坛-中国最专业的IT技术社区

 找回密码
 注册
查看: 281|回复: 5

[PL/SQL] 请教:关于在PLSQL下的游标循环insert的parallel的发现

[复制链接]
论坛徽章:
0
发表于 2017-12-5 23:25 | 显示全部楼层 |阅读模式
本帖最后由 dancingnone 于 2017-12-5 23:29 编辑

我由于经常涉及大数据量的操作,所以经常用到并行,并发等行为来提高效率。
不过最近在使用并行parallel的时候发现了个情况,例如下面的例子
  1. begin
  2.   EXECUTE IMMEDIATE 'alter session enable parallel dml';
  3. for rec in (select /*+parallel(8)*/a,b,c from t1) loop
  4. insert /*+parallel(8)*/ into t2
  5.      values
  6. (rec.a,rec.b,rec.c);
  7. commit;
  8. end loop;
  9. end;
复制代码

在上述脚本执行后,发现在session中
会有8个 select /*+parallel(8)*/a,b,c from t1 会话
但是却只有1个 insert /*+parallel(8)*/ into t2 会话;
这导致了,这个并行行为只比单线程效率提高了2+倍就遇到了瓶颈,而不是如同并发写法一样可以有8个会话共同执行insert效率能够提高接近8倍。
至于 INSERT  /*+parallel(8)*/ INTO T2 AS SELECT  /*+parallel(8)*/* FROM T1;的写法这里不讨论,因为很多条件是不允许这么写的。
根据我对oracle浅薄的了解,上面sql块对insert的并行写法应是合法的,生效的,但却没体现出什么效果来
各位达人能帮忙解解惑么?
万分感谢

论坛徽章:
0
 楼主| 发表于 2017-12-5 23:26 | 显示全部楼层
第一次发帖,不知道有代码功能,这里补一下,希望能增加一点可读性
  1. begin
  2.   EXECUTE IMMEDIATE 'alter session enable parallel dml';

  3. for rec in (select /*+parallel(8)*/a,b,c from t1) loop
  4. insert /*+parallel(8)*/ into t2
  5.      values
  6. (rec.a,rec.b,rec.c);
  7. commit;
  8. end loop;
  9. end;
复制代码

使用道具 举报

回复
论坛徽章:
480
榜眼
日期:2015-09-09 10:34:21秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12状元
日期:2015-11-23 10:04:09举人
日期:2015-11-23 10:04:09
发表于 2017-12-5 23:30 | 显示全部楼层
你只有一个会话在执行当前这个FOR循环,所有SELECT的数据出来之后还得排队,然后一个一个INSERT。
如果你要8个会话同时INSERT,就得启动8个会话,给它们不同的SELECT范围,然后执行这段循环。

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2017-12-5 23:32 | 显示全部楼层
newkid 发表于 2017-12-5 23:30
你只有一个会话在执行当前这个FOR循环,所有SELECT的数据出来之后还得排队,然后一个一个INSERT。
如果你 ...

感谢版主回复,这个意思是不是在我这个sql块中的insert 并行其实是不起作用的对吧?

使用道具 举报

回复
论坛徽章:
480
榜眼
日期:2015-09-09 10:34:21秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12状元
日期:2015-11-23 10:04:09举人
日期:2015-11-23 10:04:09
发表于 2017-12-5 23:36 | 显示全部楼层
dancingnone 发表于 2017-12-5 23:32
感谢版主回复,这个意思是不是在我这个sql块中的insert 并行其实是不起作用的对吧?

是的,完全没用。

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2017-12-5 23:39 | 显示全部楼层
newkid 发表于 2017-12-5 23:36
是的,完全没用。

明白了,看来是做了无用功,感谢版主

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 虎吧 老博客 知识索引树 读书频道 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛 | SAP ERP系统
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表