【Oracle】删除重复记录
--复习autotrace:
SET AUTOTRACE OFF --不生成AUTOTRACE 报告,这是缺省模式
SET AUTOTRACE ON EXPLAIN --AUTOTRACE只显示优化器执行路径报告
SET AUTOTRACE ON STATISTICS --只显示执行统计信息
SET AUTOTRACE ON --包含执行计划和统计信息
SET AUTOTRACE TRACEONLY --同set autotrace on,但是不显示查询输出--案例模拟
--查询原始表:
23:13:36 SQL> select * from emp;EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------ ---------- ---------- ----------7698 BLAKE MANAGER 7839 01-MAY-81 2850 307782 CLARK MANAGER 7839 09-JUN-81 2450 107788 SCOTT ANALYST 7566 19-APR-87 3000 207839 KING PRESIDENT 17-NOV-81 5000 107844 TURNER SALESMAN 7698 08-SEP-81 1500 0 307876 ADAMS CLERK 7788 23-MAY-87 1100 207900 JAMES CLERK 7698 03-DEC-81 950 307902 FORD ANALYST 7566 03-DEC-81 3000 207934 MILLER CLERK 7782 23-JAN-82 1300 107369 SMITH CLERK 7902 17-DEC-80 800 207499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 307521 WARD SALESMAN 7698 22-FEB-81 1250 500 307566 JONES MANAGER 7839 02-APR-81 2975 207654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 3014 rows selected.Elapsed: 00:00:00.09--模拟,插入重复记录
INSERT INTO emp select * from emp;--检查重复记录
23:13:39 SQL> SELECT COUNT(empno), empno FROM emp GROUP BY empno HAVING COUNT(empno) > 1;COUNT(EMPNO) EMPNO
------------ ----------2 77822 78392 78442 76982 79022 75212 77882 79342 75662 76542 74992 78762 79002 736914 rows selected.Elapsed: 00:00:00.04--方法一(只保留ROWID最小的记录):
DELETE FROM emp
WHERE empno IN(SELECT empno FROM emp GROUP BY empno HAVING COUNT(empno) > 1)
AND ROWID NOT IN(SELECT MIN(ROWID) FROM emp GROUP BY empno HAVING COUNT(empno) > 1);[lubinsu@200-168-46-3 shell_monitor]$ sqlplus lubinsu/lubinsuSQL*Plus: Release 10.2.0.1.0 - Production on Sun Aug 18 23:09:34 2013Copyright (c) 1982, 2005, Oracle. All rights reserved.Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options23:09:46 SQL> set timing on
23:09:51 SQL> set autotrace traceonly
23:09:58 SQL> set linesize 200
23:17:32 SQL> DELETE FROM emp
23:17:38 2 WHERE empno IN
23:17:40 3 (SELECT empno FROM emp GROUP BY empno HAVING COUNT(empno) > 1)
23:17:45 4 AND ROWID NOT IN
23:17:49 5 (SELECT MIN(ROWID) FROM emp GROUP BY empno HAVING COUNT(empno) > 1);14 rows deleted.Elapsed: 00:00:00.07Execution Plan
----------------------------------------------------------
Plan hash value: 319293636------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------
| 0 | DELETE STATEMENT | | 1 | 41 | 9 (34)| 00:00:01 |
| 1 | DELETE | EMP | | | | |
|* 2 | HASH JOIN ANTI | | 1 | 41 | 9 (34)| 00:00:01 |
|* 3 | HASH JOIN SEMI | | 1 | 29 | 6 (34)| 00:00:01 |
| 4 | TABLE ACCESS FULL | EMP | 14 | 224 | 2 (0)| 00:00:01 |
| 5 | VIEW | VW_NSO_1 | 1 | 13 | 3 (34)| 00:00:01 |
|* 6 | FILTER | | | | | |
| 7 | SORT GROUP BY | | 1 | 4 | 3 (34)| 00:00:01 |
| 8 | TABLE ACCESS FULL| EMP | 14 | 56 | 2 (0)| 00:00:01 |
| 9 | VIEW | VW_NSO_2 | 1 | 12 | 3 (34)| 00:00:01 |
|* 10 | FILTER | | | | | |
| 11 | SORT GROUP BY | | 1 | 16 | 3 (34)| 00:00:01 |
| 12 | TABLE ACCESS FULL | EMP | 14 | 224 | 2 (0)| 00:00:01 |
------------------------------------------------------------------------------------Predicate Information (identified by operation id):
---------------------------------------------------2 - access(ROWID="$nso_col_1")3 - access("EMPNO"="$nso_col_1")6 - filter(COUNT("EMPNO")>1)10 - filter(COUNT("EMPNO")>1)Statistics
----------------------------------------------------------1 recursive calls15 db block gets16254 consistent gets0 physical reads4256 redo size925 bytes sent via SQL*Net to client1116 bytes received via SQL*Net from client6 SQL*Net roundtrips to/from client3 sorts (memory)0 sorts (disk)14 rows processed--方法二、使用分析函数(只保留ROWID最小的记录):
23:17:57 SQL> rollback;Rollback complete.Elapsed: 00:00:00.02
23:19:11 SQL> DELETE FROM emp
23:22:22 2 WHERE ROWID IN (SELECT ROWID
23:22:28 3 FROM (SELECT ROWID row_id,
23:22:32 4 row_number() over(PARTITION BY empno ORDER BY ROWID ASC) row_num
23:22:37 5 FROM emp e) v
23:22:41 6 WHERE v.row_num >= 2);14 rows deleted.Elapsed: 00:00:00.04Execution Plan
----------------------------------------------------------
Plan hash value: 3671588261-----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------
| 0 | DELETE STATEMENT | | 1 | 24 | 5 (40)| 00:00:01 |
| 1 | DELETE | EMP | | | | |
| 2 | NESTED LOOPS | | 1 | 24 | 5 (40)| 00:00:01 |
| 3 | VIEW | VW_NSO_1 | 14 | 168 | 3 (34)| 00:00:01 |
| 4 | SORT UNIQUE | | 1 | 350 | | |
|* 5 | VIEW | | 14 | 350 | 3 (34)| 00:00:01 |
| 6 | WINDOW SORT | | 14 | 224 | 3 (34)| 00:00:01 |
| 7 | TABLE ACCESS FULL | EMP | 14 | 224 | 2 (0)| 00:00:01 |
| 8 | TABLE ACCESS BY USER ROWID| EMP | 1 | 12 | 1 (0)| 00:00:01 |
-----------------------------------------------------------------------------------------Predicate Information (identified by operation id):
---------------------------------------------------5 - filter("V"."ROW_NUM">=2)Statistics
----------------------------------------------------------1 recursive calls18 db block gets5434 consistent gets0 physical reads4448 redo size925 bytes sent via SQL*Net to client1190 bytes received via SQL*Net from client6 SQL*Net roundtrips to/from client3 sorts (memory)0 sorts (disk)14 rows processed--方法三、
23:22:45 SQL> DELETE FROM emp p WHERE ROWID NOT IN(SELECT MAX(ROWID) FROM emp i WHERE i.empno = p.empno);0 rows deleted.Elapsed: 00:00:00.13Execution Plan
----------------------------------------------------------
Plan hash value: 1987023575---------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------
| 0 | DELETE STATEMENT | | 13 | 533 | 6 (34)| 00:00:01 |
| 1 | DELETE | EMP | | | | |
|* 2 | HASH JOIN | | 13 | 533 | 6 (34)| 00:00:01 |
| 3 | VIEW | VW_SQ_1 | 14 | 350 | 3 (34)| 00:00:01 |
| 4 | SORT GROUP BY | | 14 | 224 | 3 (34)| 00:00:01 |
| 5 | TABLE ACCESS FULL| EMP | 14 | 224 | 2 (0)| 00:00:01 |
| 6 | TABLE ACCESS FULL | EMP | 14 | 224 | 2 (0)| 00:00:01 |
---------------------------------------------------------------------------------Predicate Information (identified by operation id):
---------------------------------------------------2 - access("EMPNO"="P"."EMPNO")filter(ROWID<>"VW_COL_1")Statistics
----------------------------------------------------------168 recursive calls0 db block gets10954 consistent gets0 physical reads0 redo size925 bytes sent via SQL*Net to client1008 bytes received via SQL*Net from client6 SQL*Net roundtrips to/from client2 sorts (memory)0 sorts (disk)0 rows processed--方法四、和方法三是类似的:
Elapsed: 00:00:00.03
23:28:25 SQL> DELETE FROM emp p WHERE ROWID < (SELECT MAX(ROWID) FROM emp i WHERE i.empno = p.empno);14 rows deleted.Elapsed: 00:00:00.06Execution Plan
----------------------------------------------------------
Plan hash value: 1987023575---------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------
| 0 | DELETE STATEMENT | | 1 | 41 | 6 (34)| 00:00:01 |
| 1 | DELETE | EMP | | | | |
|* 2 | HASH JOIN | | 1 | 41 | 6 (34)| 00:00:01 |
| 3 | VIEW | VW_SQ_1 | 14 | 350 | 3 (34)| 00:00:01 |
| 4 | SORT GROUP BY | | 14 | 224 | 3 (34)| 00:00:01 |
| 5 | TABLE ACCESS FULL| EMP | 14 | 224 | 2 (0)| 00:00:01 |
| 6 | TABLE ACCESS FULL | EMP | 14 | 224 | 2 (0)| 00:00:01 |
-----------------------------------------------------------------------------------方法五、使用group by,同样类似三四
23:30:01 SQL> DELETE FROM emp p WHERE ROWID NOT IN (SELECT MAX(ROWID) FROM emp i GROUP BY i.empno);14 rows deleted.Elapsed: 00:00:00.06Execution Plan
----------------------------------------------------------
Plan hash value: 3239269824----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------
| 0 | DELETE STATEMENT | | 1 | 24 | 6 (34)| 00:00:01 |
| 1 | DELETE | EMP | | | | |
|* 2 | HASH JOIN ANTI | | 1 | 24 | 6 (34)| 00:00:01 |
| 3 | TABLE ACCESS FULL | EMP | 14 | 168 | 2 (0)| 00:00:01 |
| 4 | VIEW | VW_NSO_1 | 14 | 168 | 3 (34)| 00:00:01 |
| 5 | SORT GROUP BY | | 14 | 224 | 3 (34)| 00:00:01 |
| 6 | TABLE ACCESS FULL| EMP | 14 | 224 | 2 (0)| 00:00:01 |
----------------------------------------------------------------------------------Predicate Information (identified by operation id):
---------------------------------------------------2 - access(ROWID="$nso_col_1")Statistics
----------------------------------------------------------0 recursive calls17 db block gets10836 consistent gets0 physical reads4324 redo size926 bytes sent via SQL*Net to client1002 bytes received via SQL*Net from client6 SQL*Net roundtrips to/from client2 sorts (memory)0 sorts (disk)14 rows processed--总结,还是自己想出来的方法二效率高,:)
转载于:https://www.cnblogs.com/pangblog/p/3268687.html
【Oracle】删除重复记录相关推荐
- oracle sql删除重复,【转帖】SQL Oracle删除重复记录
1.Oracle删除重复记录. 删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录. delete from people where peopleI ...
- oracle 删除重复记录
比如现在有一人员表 (表名:peosons) 若想将姓名.身份证号.住址这三个字段完全相同的记录查询出来 select p1.* from persons p1,persons p2 wh ...
- oracle如何删除重复数据第一条,oracle删除重复数据保留第一条记录
oracle删除重复数据保留第一条记录 1.查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断select * from 表 where Id in (select Id from 表 gr ...
- ORACLE查询删除重复记录
比如现在有一人员表 (表名:peosons) 若想将姓名.身份证号.住址这三个字段完全相同的记录查询出来 复制代码 代码如下: select p1.* from persons p1,perso ...
- Oracle几种查找和删除重复记录的方法总结
转载自:http://www.csdn.net/article/1970-01-01/278287 平时工作中可能会遇到当试图对库表中的某一列或几列创建唯一索引时,系统提示 ORA-01452 :不能 ...
- oracle 视图去重复,CSS_Oracle几种查找和删除重复记录的方法总结,平时工作中可能会遇到当试图 - phpStudy...
Oracle几种查找和删除重复记录的方法总结 平时工作中可能会遇到当试图对库表中的某一列或几列创建唯一索引时,系统提示 ORA-01452 :不能创建唯一索引,发现重复记录. 下面总结一下几种查找和删 ...
- 【转贴】Oracle查询重复数据与删除重复记录方法
Oracle查询重复数据与删除重复记录方法 比如现在有一人员表 (表名:peosons) 若想将姓名.身份证号.住址这三个字段完全相同的记录查询出来 select p1.* from persons ...
- oracle 查找不重复的数据,oracle不用distinct查找不重复记录和删除重复记录
1.oracle中怎么不用distinct查找不重复记录,users表有字段userid,username,password? 答: 第一种方法: select userid,username,pas ...
- ORACLE查询删除重复记录三种方法
比如现在有一人员表 (表名:peosons) 若想将姓名.身份证号.住址这三个字段完全相同的记录查询出来 复制代码代码如下: select p1.* from persons p1,perso ...
- Oracle数据库删除重复记录的方法
Oracle数据库删除重复记录的方法,做项目的时候,一位同事导数据的时候,不小心把一个表中的数据全都搞重了,也就是说,这个表里所有的记录都有一条重复的.这个表的数据是千万级的,而且是生产系统.也就是说 ...
最新文章
- TensorFlow常用Python扩展包
- 要想进入顶级数据公司,2020年数据科学10大技能帮你加分
- 填问卷赢280元SaaS峰会门票 与Salesforce、Zenefits现场交流!
- 图像滤波与OpenCV中的图像平滑处理
- RabbitMQ 核心部分
- 挖洞技巧:如何绕过URL限制
- 26 JSX深度剖析与使用技巧
- System.Drawing.Color.FromArgb(144,238,255);
- NB-IOT连接移动onenet平台流程
- 万万没想到,EfficientNet居然这么火!
- sql azure 语法_Azure SQL Server中的CREATE DATABASE语句概述
- 功率 dbm 和 mw 的换算
- redis 过期删除策略和淘汰策略 -redis设计与实现笔记
- 155款安卓开源项目源码整理+20个Android必备第三方框架
- Python 计时器倒计时弹窗提醒
- 电饭锅面包的做法大全 电饭锅怎么做面包
- 路路通软件android版,家校路路通app
- 印象笔记的使用技巧总结
- Verilog RTL 代码设计——译码器计数器
- Python中动态编译函数compile(source, filename, mode, ......)参数filename的作用是什么?...
热门文章
- 使用 k8s 搭建 confluence 6.10.x 版本
- java web-inf_对JavaWeb项目中WEB-INF目录的理解
- Linux下的JDK1.5安装
- Tomcat如何配置X-Frame-Options头
- input做成label效果
- mysql引擎机制_MySQL引擎特性:InnoDB同步机制
- 【NOILinux】VmWare15使用技巧
- c语言程序一些常见的不足,C语言常见错误分析及解决方法
- 通风技术交底书范文_通风与空调工程风管安装安全技术交底
- str_replace()函数