2

我正在使用 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 记录。

注意: A 的大小为 2 亿,B 为 170 C 为 20 D 为 10,因此 A 的大小在减小其他相同(如果 A 记录的参数为负数则不会插入到 B、C、D它存在于这些表中,因此只需将其从表中删除)因此 B、C、D 的大小没有变化,只是 A 的大小随时间减小。

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

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

  • 并行运行存在但没有锁。

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

如果表没有锁定或大小增加,还有什么其他影响可以及时实现?

注意:这不是不同的进程,在同一个进程中,我单击“执行查询”它开始非常快,但随后非常慢。

4

1 回答 1

2

从一个临时表中插入 2 亿条记录并在单个事务中将它们插入到永久表中是雄心勃勃的。如果您有一个方案将表 A 中的记录划分为可以在离散块中处理的块,那将很有用。

没有看到你的代码很难说,但我怀疑你正在尝试这个 RBAR,而不是更有效的基于集合的方法。我认为这里的关键是将插入与清除表 A 分离。插入所有记录,而不是在闲暇时对 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;
于 2013-12-28T19:31:37.970 回答