insert into select的优化

ethan_cheng 2017-02-24 04:16:03
请教一下 我这边 有一个存储封装了 表数据的采集任务
循环执行
insert /*+ APPEND*/into t (t.1,t.2)select /*+PARALLEL(a,4)*/ a.1,a.2,nvl((select c.2 from c where a.1 = c.1),1) from a where 1=1;

大部分执行都很快 就是有一张表 7W多笔的数据执行了 50多分钟,同样7W多笔数据的表1秒钟就执行完了,这个问题出在哪里?
...全文
1130 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2017-03-02
  • 打赏
  • 举报
回复
如果你一定要这样的话要确保C表有索引,有索引的话也不会很慢
「已注销」 2017-03-02
  • 打赏
  • 举报
回复
这种sql只适合查询,不适合全表关联的,不然每一条记录都要遍历一次C表,性能耗在这里
「已注销」 2017-03-01
  • 打赏
  • 举报
回复
一看就知道(select c.2 from c where a.1 = c.1), 这个有问题了 把这个写成left join 跑的飞起
ethan_cheng 2017-03-01
  • 打赏
  • 举报
回复
引用 6 楼 hi537638 的回复:
一看就知道(select c.2 from c where a.1 = c.1), 这个有问题了 把这个写成left join 跑的飞起
并不能改,因为不单单只跑一张,循环调用的,每张表的字段映射都不同 其他表都能正常执行 唯独这张会跑50多分钟
jdsnhan 2017-02-27
  • 打赏
  • 举报
回复
50多分钟的时候查看 v$session_Wait视图,看看里面有什么等待事件,再做针对性的分析
ethan_cheng 2017-02-27
  • 打赏
  • 举报
回复
引用 2 楼 sxq129601 的回复:
1,先看看SQL查询块不快 2,可能因为你加了并发,当时你的CPU实用率过高导致遇到瓶颈,需查看下CPU情况 3,你用了APPEND,可能你的表a高水位比较高或者表碎片比较大(行链接、行迁移导致),建议重导下表或者重建表
1.查询的错了,执行的是 select count(*) from (select a.1,a.2 from table); 应该不准确
ethan_cheng 2017-02-27
  • 打赏
  • 举报
回复
引用 2 楼 sxq129601 的回复:
1,先看看SQL查询块不快 2,可能因为你加了并发,当时你的CPU实用率过高导致遇到瓶颈,需查看下CPU情况 3,你用了APPEND,可能你的表a高水位比较高或者表碎片比较大(行链接、行迁移导致),建议重导下表或者重建表
1.看了下查询速度7W多笔的数据1秒不到查询完成; 2.看了服务器上这条执行时间的CPU,使用率并不高7%左右 3.每次执行前都会 DROP TABLE a CASCADE CONSTRAINTS PURGE;再create table;
sxq129601 2017-02-24
  • 打赏
  • 举报
回复
1,先看看SQL查询块不快 2,可能因为你加了并发,当时你的CPU实用率过高导致遇到瓶颈,需查看下CPU情况 3,你用了APPEND,可能你的表a高水位比较高或者表碎片比较大(行链接、行迁移导致),建议重导下表或者重建表
js14982 2017-02-24
  • 打赏
  • 举报
回复
具体情况要具体分析,你这啥信息都没的,只能凭主观猜测了

3,499

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧