Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将表数据划分为可管理的块_Sql_Oracle_Plsql - Fatal编程技术网

Sql 将表数据划分为可管理的块

Sql 将表数据划分为可管理的块,sql,oracle,plsql,Sql,Oracle,Plsql,考虑Oracle 11g中有81.000行的表: 组合键1、键2、键3是表的主键 我想将表数据分成10.000行的块,并将每个块交给dbms_job.submit,以同时对这些行执行一些操作 这里重要的是不要遗漏任何记录-所有记录都必须处理。此外,请记住,键值根本不是顺序的 我想到的一种方法是创建一个临时表 create table mytemp as (select rownum, mytable.* from myTable) 然后使用连续的行号。。。 大概是这样的: for i in 0

考虑Oracle 11g中有81.000行的表:

组合键1、键2、键3是表的主键

我想将表数据分成10.000行的块,并将每个块交给dbms_job.submit,以同时对这些行执行一些操作

这里重要的是不要遗漏任何记录-所有记录都必须处理。此外,请记住,键值根本不是顺序的

我想到的一种方法是创建一个临时表

create table mytemp as (select rownum, mytable.* from myTable)
然后使用连续的行号。。。 大概是这样的:

for i in 0..(maxChunkNumber-1) loop 
    dbms_job.submit( 'process(i*10000+1,(i+1)*10000)');
end loop;
但是,将rownum添加到上面的select会大大增加创建临时表所需的时间

有没有更好的方法来实现这一点

欢迎您的意见


谢谢

使用ORA_散列并将记录拆分为8个存储桶。使用DBMS_作业或DBMS_调度程序处理每个bucket

select * from myTable 
where ora_hash(key1 + key2 + key3, 8) = 1; -- bucket 1

select * from myTable 
where ora_hash(key1 + key2 + key3, 8) = 2; -- bucket 2

首先使用dbms_并行_执行。 其次,Steward Ashton在优秀示例中提出了更智能、更快的设计:


对于不寻常的事情,您需要访问dba_扩展数据块,但这将以较低的价格获得良好的解决方案。关键是这个键不再重要,因为您使用的是rowid。

您使用的是11g。有什么原因不想使用吗?在那之后添加临时整数计数器列-使用此计数器处理表。@fen1x您能详细说明一下整数计数器列吗?@APC可能是您的权利-我想它会帮我分块。。。值得一试,老实说,我正在考虑在某个时候检查并行执行。。。但后来不知何故,转向了dbms_job.submit-@Plirkee 1 ALTER TABLE ADD列计数器INTEGER 2用于循环,用1到81000之间的整数填充循环。3在脚本中使用计数器列而不是rownum。有趣的方法。但这些桶能保证不重叠吗?@plirke:简短的回答,是的。再长一点怎么样我的意思是,你能提供一些提示吗?比如为什么没有重叠?@Plirkee:在这篇文章中提到,ORA_散列用于散列分区:实际上,我的坏消息是,存储桶显然没有重叠——我唯一担心的是将行均匀分布到存储桶中。我对此投赞成票。。
select * from myTable 
where ora_hash(key1 + key2 + key3, 8) = 1; -- bucket 1

select * from myTable 
where ora_hash(key1 + key2 + key3, 8) = 2; -- bucket 2