【问题标题】:How to figure out which record has been deleted in an effiecient way?如何以有效的方式找出已删除的记录?
【发布时间】:2010-06-11 02:38:34
【问题描述】:

我正在研究从 db1 (Oracle) 到 db2 (Sybase) 的内部 ETL 解决方案。我们需要将数据增量(更改数据捕获?)传输到 db2。

我只有表的读取权限,所以我不能在 Oracle db1 中创建任何表或触发器。

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

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

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

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

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

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

谢谢。

【问题讨论】:

    标签: sql oracle etl


    【解决方案1】:

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

    【讨论】:

    • +1 Streams Change Data Capture 绝对是对源数据库最轻松的操作,但您必须一次性更改表以添加补充日志记录。
    • 无论如何我都不允许修改/添加源表。源数据库的所有权属于另一家公司。
    【解决方案2】:

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

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

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

    如果可能并不总是删除记录,您可以通过以下方式提高效率:

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

    如果闪回不是选项,请简要说明您的解决方案:我认为您的选择查询没什么大不了的 - 填充这些边表的所有这些插入确实需要很多时间。为什么不在更新之前对 sybase 生产服务器运行该查询?

    【讨论】:

    • 服务器之间的通信方向只是从Oracle到Sybase的一种方式。这是由于我客户公司的某种安全政策造成的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 2017-05-19
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 2011-07-22
    相关资源
    最近更新 更多