【问题标题】:How do I prevent the loading of duplicate rows in to an Oracle table?如何防止将重复行加载到 Oracle 表中?
【发布时间】:2023-03-12 11:09:02
【问题描述】:

我有一些大表(数百万行)。我不断收到包含要添加到这些表中的新行的文件——每天最多 5000 万行。我收到的大约 0.1% 的行是我已经加载的行的重复项(或者是文件中的重复项)。我想阻止将这些行加载到表中。

我目前使用 SQLLoader 以便有足够的性能来应对我的大数据量。如果我采取明显的步骤并在列上添加一个唯一索引来控制一行是否重复,SQLLoader 将开始使包含重复行的整个文件失败 - 而我只想防止正在加载重复行本身。

我知道在 SQL Server 和 Sybase 中,我可以使用“Ignore Duplicates”属性创建一个唯一索引,如果我随后使用 BCP,则根本不会加载重复行(由该索引定义)。

有没有办法在Oracle中达到同样的效果?

我不想在加载重复行后删除它们 - 对我来说重要的是,它们一开始就不应该被加载。

【问题讨论】:

  • 您如何加载文件 - SQL*Loader/Data Pump?
  • 当前使用 SQL*Loader。由于数据量很大,性能对我来说很重要。

标签: oracle duplicates


【解决方案1】:

“重复”是什么意思?如果您有一列定义了唯一行,则应针对该列设置唯一约束。通常在此列上创建一个唯一索引,这将自动设置约束。

编辑: 是的,如下所述,您应该为 SQL*Loader 设置一个“坏”文件以捕获无效行。但我认为,从数据完整性的角度来看,建立唯一索引可能是一个好主意。

【讨论】:

  • 一个很好的观点 - 我应该提到我每天加载多达 5000 万行,因此希望使用 SQLLoader 来执行数据加载。我相信如果 SQLLoader 包含违反唯一索引的重复文件,它将使整个文件失败。
  • 您可以告诉 SQL*Loader 如何处理被拒绝的行。尝试在命令行上指定一个 'badfile' 参数,并使用适当高的 'errors' 参数。
  • @Adam - 抱歉,这是针对 ginsoakedboy,而不是你。我认为唯一索引和合适的 SQL*Loader 参数的组合是可行的方法。
【解决方案2】:

使用 Oracle MERGE 语句。一些解释here.

【讨论】:

    【解决方案3】:

    您可以告知您拥有的 Oracle 版本。去那里看看merge command

    基本上是这样的

    ---- Loop through all the rows from a record temp_emp_rec
    MERGE INTO hr.employees e
         USING temp_emp_rec t
         ON (e.emp_ID = t.emp_ID)
         WHEN MATCHED THEN
        --- _You can update_
        UPDATE
         SET first_name = t.first_name,
              last_name = t.last_name
        --- _Insert into the table_
        WHEN NOT MATCHED THEN
        INSERT (emp_id, first_name, last_name)
        VALUES (t.emp_id, t.first_name, t.last_name); 
    

    【讨论】:

      【解决方案4】:

      我会使用在适当的表列上定义的完整性约束。

      Oracle 概念手册中的page 提供了概述,如果您还向下滚动,您将看到可用的约束类型。

      【讨论】:

      • 肯定是一个好方法,但为了满足我的性能需求(每天 5000 万行),我正在使用 SQLLoader 加载行。我认为如果我添加这样的索引,SQLLoader 将使整个文件失败,如果它们包含重复项,这对我的应用程序来说是不可接受的。
      【解决方案5】:

      使用下面的选项,如果你会得到这么多的错误 9999999 之后你的 sqlldr 将终止。

      OPTIONS (ERRORS=9999999, DIRECT=FALSE )
      LOAD DATA
      

      你会在坏文件中得到重复的记录。

      sqlldr user/password@schema CONTROL=file.ctl, LOG=file.log, BAD=file.bad
      

      【讨论】:

        猜你喜欢
        • 2017-07-25
        • 2012-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多