高效快速刪除Oracle表中重複記錄
如何高效刪除表中重複記錄,僅保留一條?
網上比較多的方法是如下的sql:
delete from 表 a
where (a.Id, a.seq) in
(select Id, seq from 表 group by Id, seq having count(*) > 1)
and rowid not in
(select min(rowid) from 表 group by Id, seq having count(*) > 1);
where (a.Id, a.seq) in
(select Id, seq from 表 group by Id, seq having count(*) > 1)
and rowid not in
(select min(rowid) from 表 group by Id, seq having count(*) > 1);
沒有在(id,seq)上建立聯合index的時候,將會對錶進行三次全表掃描,如果表很大的話,並不能高效刪除重複記錄.
如果改造為下面的SQL
delete 表
where rowid in (with t_save as (select Id, seq, min(rowid) min_rowid
from 表
group by Id, seq
having count(*) > 1)
select rowid
from 表 a
where exists (select 1
from t_save b
where b.id = a.id
and b.seq = a.seq
and b.min_rowid <> a.rowid)
)
將對錶只有兩次全表掃描.
where rowid in (with t_save as (select Id, seq, min(rowid) min_rowid
from 表
group by Id, seq
having count(*) > 1)
select rowid
from 表 a
where exists (select 1
from t_save b
where b.id = a.id
and b.seq = a.seq
and b.min_rowid <> a.rowid)
)
將對錶只有兩次全表掃描.
如果重複的記錄比較少,我們可以增加如下的hint:
delete 表
where rowid in (with t_save as (select Id, seq, min(rowid) min_rowid
from 表
group by Id, seq
having count(*) > 1)
select /*+ leading(b) use_nl(b a) */ rowid
from 表 a
where exists (select 1
from t_save b
where b.id = a.id
and b.seq = a.seq
and b.min_rowid <> a.rowid)
)
where rowid in (with t_save as (select Id, seq, min(rowid) min_rowid
from 表
group by Id, seq
having count(*) > 1)
select /*+ leading(b) use_nl(b a) */ rowid
from 表 a
where exists (select 1
from t_save b
where b.id = a.id
and b.seq = a.seq
and b.min_rowid <> a.rowid)
)
並在(id,seq)上建立聯合index,速度將會更快.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/195110/viewspace-753052/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle如何刪除表中重複記錄Oracle
- oracle-快速刪除重複的記錄Oracle
- Oracle 刪除表中重複記錄的DELETE SQLOracledeleteSQL
- 刪除Oracle重複記錄Oracle
- oracle刪除重複記錄Oracle
- 查詢刪除表中重複記錄
- Oracle如何刪除表中重複記錄保留第一條Oracle
- 在SQL Server中快速刪除重複記錄(轉)SQLServer
- mysql表刪除重複記錄方法MySql
- Oracle使用over()partition by刪除重複記錄Oracle
- oracle 快速刪除大批量資料方法(全部刪除,條件刪除,刪除大量重複記錄)Oracle
- Oracle查詢重複資料與刪除重複記錄Oracle
- SQL Server 批量刪除重複記錄(批量、快速、安全)SQLServer
- Oracle刪重複記錄Oracle
- oracle 快速刪除大批量資料方法(全部刪除,條件刪除,刪除大量重複記錄) 轉Oracle
- 【轉】oracle 快速刪除大批量資料方法(全部刪除,條件刪除,刪除大量重複記錄)Oracle
- Oracle中刪除表中的重複資料Oracle
- Oracle查詢重複資料與刪除重複記錄方法Oracle
- 刪除重複id的記錄
- MYSQL中刪除重複記錄的方法薦MySql
- 處理表重複記錄(查詢和刪除)
- DB2 刪除重複記錄DB2
- oracle 查詢及刪除表中重複資料Oracle
- 經典SQL面試題4:高效的刪除重複記錄方法SQL面試題
- 轉載:Oracle中查詢和刪除重複記錄方法簡介Oracle
- PostgreSQL刪除表中重複資料SQL
- MySQL刪除表重複記錄的三種方法舉例MySql
- db2中刪除重複記錄的問題DB2
- db2刪除重複的記錄DB2
- Oracle 使用分析函式刪除表中的重複行Oracle函式
- Oracle 查詢並刪除重複記錄的SQL語句OracleSQL
- 刪除oracle重複值Oracle
- mysql 刪除表中重複的資料MySql
- sql刪除重複記錄只保留一條SQL
- Oracle中刪除重複資料的SqlOracleSQL
- MySQL刪除重複記錄並保留第一條MySql
- 刪除表裡重複資料
- mysql 查詢及 刪除表中重複資料MySql