数据库中怎么限制提交的条数?
比如我在oracle执行一个提交的语句,但是时间太长了,怎么在语句里限制提交的条数?例如语句是updaetable_1aseta.aa=(selectb.aafromta...
比如我在oracle执行一个提交的语句,但是时间太长了,怎么在语句里限制提交的条数?
例如语句是
updae table_1 a set a.aa=(select b.aa from table_2 b where a.id=b.id)
where a.id in (select c.id from table_2 c) and trim(a.aa) is null;
commit;
例如上面的语句,假设table_2里有20万条的数据,一次插入肯定很慢,并且卡,不知道哪辈子才更新好,怎么样限制更新的条数,例如每1000条更新一次 展开
例如语句是
updae table_1 a set a.aa=(select b.aa from table_2 b where a.id=b.id)
where a.id in (select c.id from table_2 c) and trim(a.aa) is null;
commit;
例如上面的语句,假设table_2里有20万条的数据,一次插入肯定很慢,并且卡,不知道哪辈子才更新好,怎么样限制更新的条数,例如每1000条更新一次 展开
展开全部
这个要使用批量游标插入
我给你简单改写一下,你参考一下
declare
Type Type_AA Is Table Of table_2.aa%Type Index By Binary_Integer;
a_Type_AA Type_AA ;
cursor cur_ALL is select b.aa from table_1 a,table_2 b where a.id=b.id;
begin
open cur_ALL;
loop
fetch cur_ALL Bulk Collect Into a_Type_AA limit 1000;
forall i in 1..a_Type_AA.count
updae table_1 a set a.aa=a_Type_AA(i) where a.id in (select c.id from table_2 c) and trim(a.aa) is null;
commit;
exit when cur_ALL%notfound or cur_ALL%notfound is null;
end loop;
close cur_ALL;
exception
when others then
if cur_ALL%isopen then
close cur_ALL;
end if;
end;
这样每次只会更新1000条,而且是批量插入,没插入1000条更新一次
但是我建议你的sql要优化一下where a.id in (select c.id from table_2 c)这部分相当影响性能。
我给你简单改写一下,你参考一下
declare
Type Type_AA Is Table Of table_2.aa%Type Index By Binary_Integer;
a_Type_AA Type_AA ;
cursor cur_ALL is select b.aa from table_1 a,table_2 b where a.id=b.id;
begin
open cur_ALL;
loop
fetch cur_ALL Bulk Collect Into a_Type_AA limit 1000;
forall i in 1..a_Type_AA.count
updae table_1 a set a.aa=a_Type_AA(i) where a.id in (select c.id from table_2 c) and trim(a.aa) is null;
commit;
exit when cur_ALL%notfound or cur_ALL%notfound is null;
end loop;
close cur_ALL;
exception
when others then
if cur_ALL%isopen then
close cur_ALL;
end if;
end;
这样每次只会更新1000条,而且是批量插入,没插入1000条更新一次
但是我建议你的sql要优化一下where a.id in (select c.id from table_2 c)这部分相当影响性能。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询