如何找出以有效方式删除的记录?

时间:2010-06-11 02:38:35

标签: sql oracle etl

我正在研究内部ETL解决方案,从db1(Oracle)到db2(Sybase)。我们需要逐步传输数据(Change Data Capture?)到db2。

我只能读取对表的访问权限,因此我无法在Oracle db1中创建任何表或触发器。

我面临的挑战是,如何在Oracle中检测记录删除?

我能想到的解决方案是使用额外的独立/嵌入式数据库(例如derby,h2等)。此数据库包含2个表,即old_data,new_data。

old_data包含Oracle中感兴趣的主要关键字段。

每次运行ETL过程时,都会使用Oracle表中的主键字段填充new_data表。之后,我将运行以下sql命令来获取已删除的行:

SELECT old_data.id FROM old_data WHERE old_data.id NOT IN (SELECT new_data.id FROM new_data)

我认为当数据量变得非常大时,这将是一项非常昂贵的操作。你有更好的想法吗?

感谢。

2 个答案:

答案 0 :(得分:4)

哪个版本的Oracle?如果您有Enterprise Edition,请查看Oracle Streams。 您可以从REDO日志而不是数据库本身中删除删除

答案 1 :(得分:0)

您可以采用的一种方法是使用Oracle闪回功能(如果您使用的是版本9i或更高版本):

http://forums.oracle.com/forums/thread.jspa?messageID=2608773

这将允许您从先前的数据库状态中进行选择。

如果可能无法始终删除记录,则可以通过以下方式提高效率:

  • 在每次查询迭代时存储行数。
  • 将该行数与前一行数进行比较。
  • 如果它们不同,您知道您有删除,您必须将当前集与闪回的历史数据集进行比较。如果没有,那就不要打扰,你已经节省了很多周期。

如果闪回不是一个选项,请快速记下你的解决方案:我不认为你的选择查询是一个大问题 - 所有那些插入来填充那些真正需要花费很多时间的边表。为什么不在更新之前对sybase生产服务器运行该查询?