我们经常需要对一些重复数据进行处理,删除重复的数据,只保留一份即可。重复数据的原因很多:
1.应用上事先没有建立有效的唯一约束或主键
2.建立了唯一约束或主键,但是失效了
这里记录一个高效的处理方式,使用建立约束时的exceptions into功能,简单描述如下:
--1.构造千万级数据,并插入一些重复数据,共有42条重复,保留一份,则保留21条即可
dingjun123@ORADB> create table t as select * from dba_objects;
Table created.
Elapsed: 00:00:00.29
dingjun123@ORADB> insert into t select * from (select * from t order by dbms_random.value) where rownum<10;
9 rows created.
Elapsed: 00:00:00.17
dingjun123@ORADB> insert into t select * from (select * from t order by dbms_random.value) where rownum<3;
2 rows created.
Elapsed: 00:00:00.11
dingjun123@ORADB> /
2 rows created.
Elapsed: 00:00:00.12
dingjun123@ORADB> /
2 rows created.
Elapsed: 00:00:00.11
dingjun123@ORADB> /
2 rows created.
Elapsed: 00:00:00.11
dingjun123@ORADB> /
2 rows created.
Elapsed: 00:00:00.12
dingjun123@ORADB> /
2 rows created.
Elapsed: 00:00:00.11
dingjun123@ORADB> commit;
Commit complete.
dingjun123@ORADB> insert into t select owner,object_name,subobject_name,(select max(object_id) from t)+rownum,data_object_id,object_type,created,LAST_DDL_TIME,TIMESTAMP,STATUS,
2 TEMPORARY,GENERATED,SECONDARY,NAMESPACE,EDITION_NAME from t;
75313 rows created.
Elapsed: 00:00:00.15
dingjun123@ORADB> /
150626 rows created.
Elapsed: 00:00:00.27
dingjun123@ORADB> /
301252 rows created.
Elapsed: 00:00:00.59
dingjun123@ORADB> /
602504 rows created.
Elapsed: 00:00:03.50
dingjun123@ORADB> /
1205008 rows created.
Elapsed: 00:00:09.65
dingjun123@ORADB> commit;
Commit complete.
Elapsed: 00:00:00.00
dingjun123@ORADB> insert into t select owner,object_name,subobject_name,(select max(object_id) from t)+rownum,data_object_id,object_type,created,LAST_DDL_TIME,TIMESTAMP,STATUS,
2 TEMPORARY,GENERATED,SECONDARY,NAMESPACE,EDITION_NAME from t;
2410016 rows created.
Elapsed: 00:00:14.41
dingjun123@ORADB> /
4820032 rows created.
Elapsed: 00:00:41.13
dingjun123@ORADB> commit;
Commit complete.
Elapsed: 00:00:00.00
--2.关键,建立exceptions表,然后建立唯一约束,有重复的rowid信息自动放入exceptions表里,也就是42条重复记录的row_id会放到exceptions 表里
dingjun123@ORADB> create table exceptions(row_id rowid,
2 owner varchar2(30),
3 table_name varchar2(30),
4 constraint varchar2(30));
Table created.
Elapsed: 00:00:00.01
--可以加nologging,parallel提高效率,查找重复记录非常快
dingjun123@ORADB> alter table t add constraint uk_t unique(object_id,object_name,owner)
2 exceptions into EXCEPTIONS NOLOGGING PARALLEL 4 ;
alter table t add constraint uk_t unique(object_id,object_name,owner)
*
ERROR at line 1:
ORA-02299: cannot validate (DINGJUN123.UK_T) - duplicate keys found
Elapsed: 00:00:53.53
dingjun123@ORADB> select count(*) from t;
COUNT(*)
----------
9640064
1 row selected.
Elapsed: 00:00:01.56
--获得重复记录
dingjun123@ORADB> select count(*) from exceptions;
COUNT(*)
----------
42
1 row selected.
Elapsed: 00:00:00.01
--3.插入重复记录到临时表dups中
dingjun123@ORADB> create table dups
2 as
3 select *
4 FROM t
5 where rowid in ( select row_id from exceptions );
Table created.
Elapsed: 00:00:00.07
--4.删除所有重复记录
dingjun123@ORADB> delete from t where rowid in ( select row_id from
2 exceptions );
42 rows deleted.
Elapsed: 00:00:00.02
--5.重复记录保留一份
dingjun123@ORADB> insert into t
SELECT owner,object_name,subobject_name,(select max(object_id) from t)+rownum,data_object_id,object_type,created,LAST_DDL_TIME,TIMESTAMP,STATUS,
TEMPORARY,GENERATED,SECONDARY,NAMESPACE,EDITION_NAME
FROM (
select owner,object_name,subobject_name,object_id,data_object_id,object_type,created,LAST_DDL_TIME,TIMESTAMP,STATUS,
TEMPORARY,GENERATED,SECONDARY,NAMESPACE,EDITION_NAME,
row_number() OVER(PARTITION BY object_id,object_name,owner ORDER BY ROWID) rn
from dups
)WHERE rn=1;
21 rows created.
Elapsed: 00:00:00.01
dingjun123@ORADB> commit;
Commit complete.
Elapsed: 00:00:00.01
相关推荐
根据给定文件的信息,本文将围绕“去除重复数据”这一主题进行深入探讨,重点解析一个简单易懂且适用性广的去重算法,并通过具体的代码示例来展示其实现过程。 ### 去除重复数据的基本概念 在计算机科学中,“去除...
ORACLE 删除重复数据 在 ORACLE 数据库中,删除重复数据是一项常见的操作。重复数据的存在可能会导致数据不一致、查询效率下降等问题。今天,我们将介绍三种删除重复数据的方法,并对每种方法的执行时间进行比较。 ...
SQL Server 删除重复数据 SQL Server 删除重复数据是数据库管理中的一项重要任务。重复数据可能是完全重复的记录,也可能是部分关键字段重复的记录。删除重复数据可以使用多种方法,包括使用 SELECT DISTINCT 语句...
"易语言学习进阶去除重复数据源码"这个标题表明,我们将会探讨如何在易语言中处理数据源,特别是如何去除其中的重复项,这对于数据处理和分析来说是一项基本但重要的技能。 在编程中,数据源通常指的是存储数据的...
在Oracle数据库中,删除重复数据是一项常见的数据清洗任务,尤其当表设计不当时,重复数据可能导致数据不一致和分析错误。以下将详细解释如何在Oracle中处理这两种类型的重复数据问题:部分字段重复和完全重复记录。...
"数据库查询删除重复数据" 数据库查询删除重复数据是数据库管理中的一项重要操作,旨在查找和删除表中的重复记录。重复记录是根据单个字段或多个字段来判断的。下面介绍几种查找和删除重复记录的方法。 根据单个...
在Oracle SQL中,删除重复数据并保留最新日期的实例是一个常见的数据清理任务,尤其是在具有历史记录或事务数据的数据库中。这个实例展示了如何通过SQL查询有效地处理这种情况。在这个例子中,我们有一个名为`abc`的...
### Oracle 下删除重复数据的方法及分析 #### 一、部分字段重复数据的处理 ##### 查询重复数据 在Oracle数据库中,经常会遇到表中存在部分字段重复的情况。为了找到这些重复的记录,我们可以使用以下SQL语句: `...
### ORACLE去除重复数据方法 在数据库管理与维护过程中,数据重复问题是非常常见的现象,尤其在大型企业级应用中更是如此。重复数据不仅占用存储空间,还可能导致数据分析结果出现偏差,影响业务决策的准确性。因此...
### Oracle数据库删除重复数据的方法 在Oracle数据库管理中,处理重复数据是一项常见且重要的任务。重复数据不仅会占用额外的存储空间,还可能导致数据分析时出现偏差。因此,掌握如何有效地识别并删除这些重复记录...
5. **删除重复数据**:在确认了要删除的重复记录后,可以使用Access的“删除查询”功能来移除它们。但请注意,删除操作是不可逆的,因此在执行前务必备份数据。 6. **自动化过程**:如果经常需要进行此操作,可以...
因此,掌握如何在Excel中删除重复数据是一项非常实用且重要的技能。 ### 标题:Excel中删除重复数据 #### 知识点一:手动删除重复数据 1. **选择数据范围**:首先选中包含重复数据的列或整个数据区域。 2. **使用...
oracle 删除重复数据的几种方法 在 Oracle 中,删除重复的数据是一种常见的操作。delete 操作可以用来删除重复的数据,但是需要根据实际情况选择合适的方法。下面将介绍四种删除重复数据的方法,每种方法都有其优...
去除重复数据是指从链表中删除重复的元素,例如,如果链表中有多个相同的元素,只保留一个。去除重复数据可以使用多种算法,例如哈希表算法、排序算法等。在本例中,我们使用了一种简单的算法来去除重复数据。 下面...
### SQL Server删除重复数据的方法 在数据库管理过程中,经常会遇到需要清理重复数据的情况。重复数据不仅浪费存储空间,还可能导致数据分析结果出现偏差。对于SQL Server而言,有多种方法可以用来删除重复的数据,...
Excel 2021 删除重复数据项 在 Excel 2021 中,删除重复数据项变得更加方便和快捷。下面是相关知识点的详细解释: 1. 删除重复数据项的重要性 在数据分析和处理过程中,删除重复数据项是一项非常重要的步骤。重复...
### PL/SQL删除Oracle数据库中的重复记录方法详解 ...通过上述步骤,你可以有效地识别并删除Oracle数据库中的重复记录,从而保持数据的一致性和准确性。这种方法不仅适用于简单的场景,对于复杂的业务环境也同样适用。
### 基于MD5算法的重复数据删除技术的研究与改进 #### 一、引言 随着信息技术的迅速发展,企业对于数据的需求日益增长。在信息化时代,数据被视为企业的核心资产,不仅对于日常运营至关重要,同时也是企业进行战略...
Excel 中去除重复数据的多种方法 Excel 是一个非常强大和普遍使用的电子表格软件,它提供了许多实用的功能来帮助用户处理和分析数据。其中,去除重复数据是一个非常重要和常用的操作。本文将详细介绍多种在 Excel ...