Oracle进程越来越慢

时间:2013-12-27 14:24:39

标签: sql performance oracle plsql slowdown

我正在使用oracle数据库,我的工作是

  1. 取表A的1条记录。(表A有P栏,让我们说 它的值是x,y,z)

  2. 根据值x,y,z将该记录放入表B或C或D. (如果P = x然后将记录放到表B,如果P = y则将记录放入 表C ......)

  3. 删除我们插入表B或C或D的A记录。

  4. 注意: A的大小是2亿,B是170 C是20 D是10所以A的大小正在减少其他是相同的(如果A记录的参数是负的那么它没有插入到B,C,D中它们存在于这些表中,所以只是从表中删除它所以B,C,D的大小没有变化,只是A的大小随时间减少。

    问题是一开始一切都很好,但随着时间的推移,它变得非常缓慢。大约在1秒内进行40次插入+删除,但是在3秒内处理1次插入+删除。

    • 所有表在相应列中都有索引。

    • Paralel run存在但没有锁定。

    • 表格大小约为6000万条记录。

    还有什么其他影响 - 及时 - 如果表没有锁定或大小增加?

    注意:它不是不同的进程,在同一个进程中我单击“执行查询”它启动速度非常快但非常慢。

1 个答案:

答案 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;