--复习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 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30 14 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 7782
2 7839
2 7844
2 7698
2 7902
2 7521
2 7788
2 7934
2 7566
2 7654
2 7499
2 7876
2 7900
2 7369 14 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/lubinsu SQL*Plus: Release 10.2.0.1.0 - Production on Sun Aug 18 23:09:34 2013 Copyright (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 options 23: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.07 Execution 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 calls
15 db block gets
16254 consistent gets
0 physical reads
4256 redo size
925 bytes sent via SQL*Net to client
1116 bytes received via SQL*Net from client
6 SQL*Net roundtrips to/from client
3 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.04 Execution 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 calls
18 db block gets
5434 consistent gets
0 physical reads
4448 redo size
925 bytes sent via SQL*Net to client
1190 bytes received via SQL*Net from client
6 SQL*Net roundtrips to/from client
3 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.13 Execution 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 calls
0 db block gets
10954 consistent gets
0 physical reads
0 redo size
925 bytes sent via SQL*Net to client
1008 bytes received via SQL*Net from client
6 SQL*Net roundtrips to/from client
2 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.06 Execution 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.06 Execution 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 calls
17 db block gets
10836 consistent gets
0 physical reads
4324 redo size
926 bytes sent via SQL*Net to client
1002 bytes received via SQL*Net from client
6 SQL*Net roundtrips to/from client
2 sorts (memory)
0 sorts (disk)
14 rows processed --总结,还是自己想出来的方法二效率高,:)

【Oracle】删除重复记录的更多相关文章

  1. 初探oracle删除重复记录,只保留rowid最小的记录

    如题,初探oracle删除重复记录,只保留rowid最小的记录(rowid可以反映数据插入到数据库中的顺序) 一.删除重复记录可以使用多种方法,如下只是介绍了两种方法(exist和in两种). 1.首 ...

  2. oracle删除重复记录,只保留rowid最小的记录

    初探oracle删除重复记录,只保留rowid最小的记录   如题,初探oracle删除重复记录,只保留rowid最小的记录(rowid可以反映数据插入到数据库中的顺序) 一.删除重复记录可以使用多种 ...

  3. oracle 删除重复记录

    查询及删除重复记录的SQL语句   1.查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断   select * from 表 where Id in (select Id from 表 g ...

  4. Oracle删除重复记录只保留一条数据的几种方法

    1. 问题描述 BBSCOMMENT表为BBSDETAIL的从表,记录商户评价信息.因为数据倒腾来倒腾去的,有很多重复数据.表结构如下: COMMENT_ID NOT NULL NUMBER --主键 ...

  5. 【转】oracle 删除重复记录

    转至:http://blog.163.com/aner_rui/blog/static/12131232820105901451809/ 2.保留一条(这个应该是大多数人所需要的 ^_^) Delet ...

  6. Oracle 查询并删除重复记录的SQL语句

    查询及删除重复记录的SQL语句 1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select * from peoplewhere peopleId in (select  ...

  7. oracle中查找和删除重复记录的几种方法总结

    平时工作中可能会遇到当试图对库表中的某一列或几列创建唯一索引时,系统提示 ORA-01452 :不能创建唯一索引,发现重复记录. 下面总结一下几种查找和删除重复记录的方法(以表CZ为例): 表CZ的结 ...

  8. ORACLE查询删除重复记录

     比如现在有一人员表 (表名:peosons) 若想将姓名.身份证号.住址这三个字段完全相同的记录查询出来 复制代码 代码如下: select p1.*   from persons  p1,pers ...

  9. ORACLE查询删除重复记录三种方法

    本文列举了3种删除重复记录的方法,分别是rowid.group by和distinct,小伙伴们可以参考一下.   比如现在有一人员表 (表名:peosons) 若想将姓名.身份证号.住址这三个字段完 ...

  10. Oracle删除重复数据记录

    删除重复记录,利用ROWID 和MIN(或MAX)函数, ROWID在整个数据库中是唯一的,由Oracle自己产生和维护,并唯一标识一行(无论该表中是否有主键和唯一性约束),ROWID确定了每条记录在 ...

随机推荐

  1. 将字符串变成大写----C++实现

    虽然这个题目很简单,但是也是会范很多错误的,平时你肯定知道,但是在编程的时候就是容易犯傻,而且八匹马都拽不回来... 看来还是要多写写代码..不废话了. 直接贴代码.. #include<ios ...

  2. QOdbc 读写 excel

    ).toString(); ).toInt(); qDebug()<< name << age <<endl; } // 关闭数据库 db.close(); } i ...

  3. 文章转载至CSDN社区罗升阳的安卓之旅,原文地址:

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6720261 前面我们在分析Activity启动 ...

  4. 解开Android应用程序组件Activity的"singleTask"之谜

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6714543 在Android应用程序中,可以配 ...

  5. Android加载图片OOM错误解决方式

    前几天做项目的时候,甲方要求是PAD (SAMSUNG P600 10.1寸 2560*1600)的PAD上显示高分辨率的大图片. SQLITE採用BOLD方式存储图片,这个存取过程就不说了哈,网上一 ...

  6. Linux下安装软件的错误

    1. make configure GEN configure/bin/sh: 1: autoconf: not foundmake: *** [configure] Error 127 解决:sud ...

  7. 关于IIS7.5下的web.config 404 配置的一些问题

    本文介绍一个关于IIS环境下web.config配置的经验问题.在IIS7.5中添加配置404页面时遇到了一些问题,记录如下: 一开始在<customError>下的<error&g ...

  8. 如何在WP8模拟器中连接本地的web服务

    这个问题困扰了很久,查找答案一度找偏方向. 其实连接web服务对于wp7不是问题,因为wp7使用的网络就是本机的网络,但是到了wp8模拟器,纯粹的虚拟机,独立的设备,也就有了自己的网络连接,要当做虚拟 ...

  9. VS 2003 无法打开Web项目,位于服务器“http:10.45.4.70:8080”上的项目不存在

    解决方法: 用记事本打开*.sln文件更改第2行 改成正确的虚拟目录 出现这种情况往往是从一台机器搬到另一台机器造成的虚拟路径名字不同

  10. 1203.2——条件语句 之 switch语句

    用 if else 语句在处理多分支的时候,分支太多就会显得不方便,且容易出现 if 和 else配对出现错误的情况.例如,输入一个整数,输出该整数对应的星期几的英文表示: #include < ...