2012-12-12 21 views
1

我正在增强基于java的ETL软件。 Oralce安装中的这个工具的一个问题是,当在ETL期间发生大量删除时,即使我使用中间提交的较小批量大小,批量将耗尽UNDO空间。在我目前的生产环境中,存在4GB的硬限制。所以,现在,我的程序试图从父表中删除10000条记录,在每1000条记录和每个记录删除后提交,级联从5个子表中删除100万条记录,我已经发生了1000x5x1000,000条删除批/提交。我希望我的软件比这更聪明 - 我希望它找出Oracle UNDO空间,估计将触发多少删除并相应地限制批量大小。我该怎么做呢?如何使用查询来确定UNDO相关信息?如何编写ETL以基于Oracle UNDO设置进行操作?

+2

如果你正在做一些使用所有撤销的东西,那么你应该增加它。没有帮助我知道,但4GB的硬限制看起来很小。我刚刚通过了一些数据库,其大小分别为50GB,28GB,38GB,126GB和44GB。 – Ben

+0

你会得到什么错误? ORA-1555? –

+1

也许truncate是要走的路。 – Rene

回答

2

4GB不算什么。正确的做法是增加UNDO空间。

请注意,大规模删除也是不鼓励的,而且很值得研究如何消除这种删除。

+0

好吧..我不完全控制多少删除..它将取决于数据依赖性。 (也就是说,您从类型表中删除了订单类型A,您可能会清除一百万份订单和订购商品,但删除类型B可能会消耗1000万份订单和订购商品)。 – Jay

+1

如果这是您必须处理的情况,那么按订单类型进行分区并执行分区删除或截断可能会很有效。但是,它似乎是一个奇怪的操作,删除订单。 –

+0

不完全删除订单 - 这只是一个比喻。但是,这更像是DBA的事情,不是吗?不在应用程序的范围内? – Jay