Oracle11g Oracle:批量删除重复记录

Oracle11g Oracle:批量删除重复记录,oracle11g,Oracle11g,我有一个表,其中有1220200条重复记录 我正在使用下面的查询删除重复记录 DELETE /*+ NO_CPU_COSTING */ FROM FCST f1 WHERE ROWID > (SELECT MIN (ROWID) FROM FCST f2 WHERE f1.DMDUNIT = f2.DMDUNIT

我有一个表,其中有1220200条重复记录

我正在使用下面的查询删除重复记录

DELETE /*+ NO_CPU_COSTING  */
  FROM  FCST f1
  WHERE
       ROWID >
           (SELECT MIN (ROWID)
              FROM FCST f2
             WHERE 
                  f1.DMDUNIT = f2.DMDUNIT
                   AND f1.DMDGROUP = f2.DMDGROUP
                   AND f1.LOC = f2.LOC
                   AND f1.STARTDATE = f2.STARTDATE
                   AND f1.TYPE = f2.TYPE
                   AND UPPER (f1.FCSTID) = UPPER (f2.FCSTID));
删除这些记录几乎需要2分钟。我也尝试了批量删除方法,将重复数据加载到游标中并批量删除,但这需要更多的时间


优化此代码的更好方法是什么?

一个简单的方法如下

delete /*+RULE*/ from t
where rowid in ( select rid
                   from ( select rowid rid,
                                 row_number() over
                                   (partition by cust_seg_nbr order by rowid) rn
                            from t
                        )
                 where rn <> 1 );
包含“ROWID>…”的查询基本上是可疑的

我想你要找的是:

DELETE FROM
  FCST f1
WHERE
  ROWID NOT IN (
    SELECT   MIN(ROWID)
    FROM     FCST f2
    GROUP BY f2.DMDUNIT,
             f2.DMDGROUP,
             f2.LOC,
             f2.STARTDATE,
             f2.TYPE,
             UPPER(f2.FCSTID));
子查询标识一组ROWID,这些ROWID覆盖GROUP BY子句中列的所有唯一值,并删除所有其他列


一个更快的替代方法可能是创建一个新表,其中只包含要保留的行,但是如果这足够好,那么就坚持使用它。

这真的重要吗?你肯定只会做一次,2分钟删除120万个副本似乎很合理。嗨,托尼,感谢您的快速响应。这是迁移的一部分,每次从示例转储设置新数据库时都会执行。除了解决方案之外,我更感兴趣的是了解是否可以使用类型对其进行优化,大容量收集或可能是并行pl/sql?如果您有大量数据,那么我怀疑您最不希望的方法是使用嵌套游标,尤其是在包含提交的情况下。这似乎是导致性能不佳的原因。
DELETE FROM
  FCST f1
WHERE
  ROWID NOT IN (
    SELECT   MIN(ROWID)
    FROM     FCST f2
    GROUP BY f2.DMDUNIT,
             f2.DMDGROUP,
             f2.LOC,
             f2.STARTDATE,
             f2.TYPE,
             UPPER(f2.FCSTID));