Sql 删除oracle表中的重复记录:大小为389 GB

Sql 删除oracle表中的重复记录:大小为389 GB,sql,database,oracle,truncate,Sql,Database,Oracle,Truncate,需要从表中删除重复记录。表包含33列,其中只有PK_NUM是主键列。由于PKKNUM包含独特的记录,我们需要考虑MI/MAX值。 表中记录总数:1766799022 表中的不同记录:69237983 表中的重复记录:1697561039 栏目详情: 4:日期数据类型 4:数字数据类型 1:字符数据类型 24:Varchar2数据类型 表格大小:386 GB 数据库详细信息:Oracle数据库11g EE::11.2.0.2.0::64位生产 样本数据: col1,col2,col3 美国广播公司

需要从表中删除重复记录。表包含33列,其中只有PK_NUM是主键列。由于PKKNUM包含独特的记录,我们需要考虑MI/MAX值。 表中记录总数:1766799022 表中的不同记录:69237983 表中的重复记录:1697561039 栏目详情:

4:日期数据类型 4:数字数据类型 1:字符数据类型 24:Varchar2数据类型 表格大小:386 GB

数据库详细信息:Oracle数据库11g EE::11.2.0.2.0::64位生产

样本数据:

col1,col2,col3 美国广播公司,123 2,PQR,456 美国广播公司,123 预期数据应仅包含2条记录:

col1,col2,col3 美国广播公司,123 2,PQR,456 *1可以替换为3,反之亦然

我的计划是

提取不同的记录并将其存储在备份表中 截断现有表并将记录从备份移动到现有表。 由于数据量巨大

想知道什么是用于检索distinct的优化sql吗 记录 是否有关于完成插入需要花费多少的估计 选择并截断现有表。 请一定要让我知道,如果有任何其他最好的方法来实现这一点。我的最终目标是删除重复项。

尝试以下方法:

rename table_name to table_name_dup;
然后:

create table table_name 
as
select 
  min(col1)
, col2
, col3
from table_name_dup
group by 
  col2
, col3;
据我所知,使用的temp_表空间并不多,因为整个groupby发生在将创建新表的目标表空间中。完成后,您可以删除带有重复项的:

drop table table_name_dup;

使该内存高效的一个选项是,将NOLOGING追加所有行插入到一个表中,该表在要检测重复项的列列表上进行哈希分区,或者如果列数有限制,则尽可能多地使用,以达到最大选择性。使用类似1024个分区的东西,理想情况下每个分区都在周围

然后,您已经将每行的所有潜在重复项隔离到同一分区中,重复数据消除的标准方法将在每个分区上运行,而不会消耗太多内存

所以对于每个分区,您可以执行如下操作

insert /*+ append */ into new_table
select *
from   temp_table partition (p1) t1
where  not exists (
         select null
         from   temp_table partition (p1) t2
         where  t1.col1 = t2.col1 and
                t1.col2 = t2.col2 and
                t1.col3 = t2.col3 and
                ... etc ...
                t1.rownum < t2.rownum);

这里性能良好的关键是,为在该查询中执行反连接而创建的哈希表(其大小几乎与分区本身一样大)能够放入内存中。因此,如果您可以管理2GB的排序区域,则至少需要389/2=大约200个表分区。四舍五入到最接近的二次方,因此在这种情况下,将其设为256个表分区。

根据我的经验,插入将比删除快得多。所以你的方法听起来不错。当您将原始表和备份删除到旧名称并重新创建所有约束时,可以更快地完成备份。然后保存重新插入行的工作显示需要比较多少列以获得差异?需要15列来比较差异机器有多少可用内存,或者PGA的最大可用大小是多少?而不是插入差异。。选择一个CTA,它将是不带索引的,而且速度更快,可能更快。此操作将需要大约389GB的临时表空间。根据我的DBA,389GB的临时表空间不可用…任何其他解决方法请参阅我答案中的哈希分区建议。如果您有可用的分区,那么它将大大减少临时排序需求。