我正在使用oracle数据库,我的工作是
取表A的1条记录。(表A有P栏,让我们说 它的值是x,y,z)
根据值x,y,z将该记录放入表B或C或D. (如果P = x然后将记录放到表B,如果P = y则将记录放入 表C ......)
删除我们插入表B或C或D的A记录。
注意: A的大小是2亿,B是170 C是20 D是10所以A的大小正在减少其他是相同的(如果A记录的参数是负的那么它没有插入到B,C,D中它们存在于这些表中,所以只是从表中删除它所以B,C,D的大小没有变化,只是A的大小随时间减少。
问题是一开始一切都很好,但随着时间的推移,它变得非常缓慢。大约在1秒内进行40次插入+删除,但是在3秒内处理1次插入+删除。
所有表在相应列中都有索引。
Paralel run存在但没有锁定。
还有什么其他影响 - 及时 - 如果表没有锁定或大小增加?
注意:它不是不同的进程,在同一个进程中我单击“执行查询”它启动速度非常快但非常慢。
答案 0 :(得分:2)
从一个临时表中插入2亿条记录并将它们插入到单个事务中的永久表中是雄心勃勃的。如果您有一个将表A中的记录划分为可以在离散块中处理的块的方案,那将是有用的。
如果没有看到您的代码,很难说,但我怀疑您是在尝试这种RBAR而不是更有效的基于集合的方法。我认为这里的关键是从清理表A中解除插入。插入所有记录,而不是在闲暇时使用zap A.像这样的东西
insert all
when p = 'X' then into b
when p = 'Y' then into c
when p = 'Z' then into d
select * from a;
truncate table a;