0

我有一个 txn 表,每个月有 200 万行我正在使用存储过程将数据加载到该表中。如果在我的过程中失败并且我曾经再次加载,我需要使用以下方法删除事务。

Table TXN structure

TXN_ID    NUMBER primary key 
TXN_AMT   number
YEAR    varchar2
MONTH   varchar2

我可以在这里使用批量收集吗,但是在 where 子句中我需要

DELETE FROM TXN WHERE YEAR=cYear and Month=cMonth 

请建议我如何使它快速

4

2 回答 2

1

“如果在我的过程中失败并且我曾经再次加载,我需要使用以下方式删除交易。”

看来您的实际问题是加载过程。您应该将整个负载定义为一个工作单元,即在 2000000 行末尾有一个提交。然后,您不必在失败时删除任何内容。

目前,您显然有间歇性提交。您认为需要这样做的原因可能有多种,但它们都是虚假的。您只需让您的 DBA 调整 UNDO 表空间的大小,使其大小适合您的数据量。或者,您需要重新编写加载过程,以便确定哪些行已加载(即已提交);如果发生故障,您可以只加载剩余部分。


就加快删除过程而言,您没有太多选择。FORALL 处理不会更快:PL/SQL 会产生开销,因此不会比直接 DELETE 便宜。除非您有一个包含十年数据的表,否则 (YEAR,MONTH) 上的索引将没有任何用处。

如果您有企业版和大量 CPU,您可以尝试使用 PARALLEL DML 在更短的时间内执行删除。

但是,与任何调优问题一样,您需要了解语句的当前执行路径,这意味着从解释计划开始。你知道,它们不仅适用于 SELECT。

于 2012-10-03T07:36:41.223 回答
0

作为一种替代方法,因为您要删除数据基础 Month 和 Year

  • 您可以在表中创建按月分区,并在不需要时删除特定月份的分区。(ALTER TABLE TABLENAME DROP PARTITION PARTION_NAME)
  • 同样,如果加载失败,只需截断该月分区并再次加载。
  • 您可以进一步编写一个 PL/SQL 作业,该作业可以根据预定义的条件删除分区,例如 2012 年 12 月 1 日的 DROP PARTION_DEC_2011。并在使用它加载新数据前 2 个月添加一个分区。
于 2012-10-03T06:15:25.780 回答