问题描述
嗨,汤姆,
我需要您的帮助,以在更短的时间内优化过程,该过程最初需要40分钟才能将1400万记录插入/更新到表中。我们有一个表 (2000万记录) 的查询,该表每天插入/更新 (1400万记录) 到另一个表。附上我正在使用的程序
立即执行 “改变表测试术语”;
声明
游标c_data为
选择/* FIRST_ROWS(n) */ G.C1,G.C2,G.C3,G.C4,G.C5,
tab_to_uniq_string_limit (CAST (收集 (G.C6订单由G.C7))
作为t_varchar2_tab),',',1000) 作为C6,
tab_to_uniq_string_limit (CAST (收集 (G.C7按G.C7订购))
作为t_varchar2_tab),',',500) 作为C7,
最大 (g.row_last_modified) 为C8,
G.C9
从表1g
按G.GE_ID,G.ENTRY_PARENTAGE,G.Entry_谱系,G.材料 _ 类型,G.VARIETY_NAME,G.Pedigree _ 安全分组
减
选择C1、C2、C3、C4、C5、C6、C7、C8、C9
来自表2;
类型t__ data是表的c_data % rowtype索引由binary_integer;
t_data t__ 数据;
开始
打开c_data;
循环
将c_data批量收集到t_data限制10000中;
当t_data.count = 0时退出;
对于t_data.first中的idx。。t_data.last循环
更新表2集
C2 = t_data(idx)。C2,
C3 = t_data(idx)。C3,
C4 = t_data(idx)。C4,
C5 = t_data(idx)。C5,
C6 = t_data(idx)。C6,
C7 = t_data(idx)。C7,
C8 = t_data(idx)。C8,
C1 = t_data(idx)。C1
其中C1 = t_data(idx).C2;
如果 (SQL % ROWCOUNT = 0),则
将/* 追加 */插入表2
(C1、C2、C3、C4、C5、C6、C7、C8、C9)
值
(t_data(idx).C1,t_data(idx).C2,t_data(idx).C3,t_data(idx).C4,t_data(idx).C5,t_data(idx).C6,t_data(idx).C7,t_data(idx).C8,t_data(idx).C9);
如果结束;
结束循环;
提交;
结束循环;
关闭c_data;
结束;
提交;
立即执行 “alter table测试登录”;
请建议一个好的解决方案来优化它。我尝试使用合并,但即使花费了太长时间。
我需要您的帮助,以在更短的时间内优化过程,该过程最初需要40分钟才能将1400万记录插入/更新到表中。我们有一个表 (2000万记录) 的查询,该表每天插入/更新 (1400万记录) 到另一个表。附上我正在使用的程序
立即执行 “改变表测试术语”;
声明
游标c_data为
选择/* FIRST_ROWS(n) */ G.C1,G.C2,G.C3,G.C4,G.C5,
tab_to_uniq_string_limit (CAST (收集 (G.C6订单由G.C7))
作为t_varchar2_tab),',',1000) 作为C6,
tab_to_uniq_string_limit (CAST (收集 (G.C7按G.C7订购))
作为t_varchar2_tab),',',500) 作为C7,
最大 (g.row_last_modified) 为C8,
G.C9
从表1g
按G.GE_ID,G.ENTRY_PARENTAGE,G.Entry_谱系,G.材料 _ 类型,G.VARIETY_NAME,G.Pedigree _ 安全分组
减
选择C1、C2、C3、C4、C5、C6、C7、C8、C9
来自表2;
类型t__ data是表的c_data % rowtype索引由binary_integer;
t_data t__ 数据;
开始
打开c_data;
循环
将c_data批量收集到t_data限制10000中;
当t_data.count = 0时退出;
对于t_data.first中的idx。。t_data.last循环
更新表2集
C2 = t_data(idx)。C2,
C3 = t_data(idx)。C3,
C4 = t_data(idx)。C4,
C5 = t_data(idx)。C5,
C6 = t_data(idx)。C6,
C7 = t_data(idx)。C7,
C8 = t_data(idx)。C8,
C1 = t_data(idx)。C1
其中C1 = t_data(idx).C2;
如果 (SQL % ROWCOUNT = 0),则
将/* 追加 */插入表2
(C1、C2、C3、C4、C5、C6、C7、C8、C9)
值
(t_data(idx).C1,t_data(idx).C2,t_data(idx).C3,t_data(idx).C4,t_data(idx).C5,t_data(idx).C6,t_data(idx).C7,t_data(idx).C8,t_data(idx).C9);
如果结束;
结束循环;
提交;
结束循环;
关闭c_data;
结束;
提交;
立即执行 “alter table测试登录”;
请建议一个好的解决方案来优化它。我尝试使用合并,但即使花费了太长时间。
专家解答
我们需要找出问题所在。合并 (与上述相同的SQL或逻辑代码) 可以:
a-获取源行
b-与目标行匹配
c-执行插入/更新
所以首先我会做一个时间测试:
其中C是你上方的光标。这告诉你找到行的时间。
然后将C中的行转储到全局临时表 (GTT) 中。然后给GTT和你的目标表之间的连接时间。这就是匹配行的成本。
然后对将部分/所有GTT行插入目标的测试进行时间测试-这是一个插入测试。
然后,您将知道将精力集中在哪里。但是我要说的是-合并的可能性要比本土的同类产品好得多。
a-获取源行
b-与目标行匹配
c-执行插入/更新
所以首先我会做一个时间测试:
set timing begin for i in c loop null; end loop; end; /复制
其中C是你上方的光标。这告诉你找到行的时间。
然后将C中的行转储到全局临时表 (GTT) 中。然后给GTT和你的目标表之间的连接时间。这就是匹配行的成本。
然后对将部分/所有GTT行插入目标的测试进行时间测试-这是一个插入测试。
然后,您将知道将精力集中在哪里。但是我要说的是-合并的可能性要比本土的同类产品好得多。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。