Oacle 중복 기록 삭제

2272 단어 orraacclle빠르다
보고 있 는 ORACLE 튜 토리 얼 은 Oacle 에서 중 복 된 기록 을 빠르게 삭제 하 는 것 입 니 다.프로젝트 를 할 때 한 동료 가 데 이 터 를 가 져 올 때 실수 로 한 표 의 데 이 터 를 모두 다시 만 들 었 다.즉,이 표 안의 모든 기록 이 중복 되 었 다 는 것 이다.이 표 의 데 이 터 는 천만 급 이 고 생산 시스템 이다.모든 기록 을 삭제 할 수 없고 중복 기록 을 빨리 삭제 해 야 한 다 는 것 이다.이에 따라 중복 기록 을 삭제 하 는 방법 과 각 방법의 장단 점 을 정리 했다.진술 의 편 의 를 위해 표 이름 이 Tbl 이 라 고 가정 하면 표 에 3 열 col 1,col 2,col 3 이 있 는데 그 중에서 col 1,col 2 는 메 인 키 이 고 col 1,col 2 에 색인 을 추가 했다.1.임시 표를 만 들 면 데 이 터 를 임시 표 에 가 져 온 다음 에 원래 표 의 데 이 터 를 삭제 한 다음 에 데 이 터 를 원래 표 로 가 져 올 수 있 습 니 다.SQL 문 구 는 다음 과 같 습 니 다.creat table tbl_tmp (select distinct* from tbl);truncate table tbl;//클 리 어 시트 레코드 insert into tbl select * from tbl_tmp;//임시 표 의 데 이 터 를 삽입 하 다.  이런 방법 은 수 요 를 실현 할 수 있 지만 매우 뚜렷 하 다.천만 급 기록 표 에 대해 이런 방법 은 매우 느리다.생산 시스템 에서 이것 은 시스템 에 매우 큰 비용 을 가 져 다 줄 것 이 고 실행 할 수 없다.2.rowid 를 이용 하여 Oacle 에서 모든 기록 에 rowid 가 있 습 니 다.rowid 는 전체 데이터 베이스 에서 유일한 것 입 니 다.rowid 는 모든 기록 이 Oacle 의 어떤 데이터 파일,블록,줄 인지 확인 합 니 다.중 복 된 기록 에 서 는 모든 열의 내용 이 같 을 수 있 지만 rowid 는 같 지 않 습 니 다.SQL 문 구 는 다음 과 같 습 니 다:delete from tbl where rowid in (select a.rowid from tbl a, tbl b where a.rowid>b.rowid and a.col1=b.col1 and a.col2 = b.col2)  모든 기록 이 중복 되 는 것 만 알 고 있다 면,이 sql 문 구 는 적 용 됩 니 다.그러나 각 기록 의 중복 기록 이 N 조 가 있다 면 이 N 은 알 수 없 는 것 이 므 로 다음 과 같은 방법 을 적용 하 는 것 을 고려 해 야 한다.3.max 또는 min 함 수 를 이용 하여 여기 서도 rowid 를 사용 해 야 합 니 다.위 와 다른 것 은 max 또는 min 함 수 를 결합 하여 이 루어 집 니 다.SQL 문 구 는 다음 과 같 습 니 다 delete from tbl awhere rowid not in (select max(b.rowid) from tbl b where a.col1=b.col1 and a.col2 = b.col2);//여기 max 에서 min 을 사용 해도 돼 요.  혹은 아래 문장 으로 delete from tbl awhere rowid<(select max(b.rowid) from tbl b where a.col1=b.col1 and a.col2 = b.col2);//여기 서 max 를 min 으로 바 꾸 면 앞의 where 자구 에서'<'를'>'로 바 꿔 야 합 니 다.  위의 방법 과 사고방식 은 기본적으로 같 지만 그룹 을 사용 했다 by,외 현적 비교 조건 을 줄 이 고 효율 을 높 였 다.SQL 문 구 는 다음 과 같 습 니 다:deletefrom tbl where rowid not in (select max(rowid) from tbl tgroup by t.col1, t.col2);delete from tbl where (col1, col2) in (select col1,col2 from tblgroup bycol1,col2havingcount(*) >1)and rowidnotin(selectnin(rowid)fromtblgroup bycol1,col2havingcount(*) >1)  표 에 중복 기록 이 있 는 기록 이 적 고 색인 이 있 는 경우 에 도 적용 되 는 방법 도 있다.col 1,col 2 에 색인 이 있 고 tbl 표 에 중복 기록 이 있 는 기록 이 비교적 적다 고 가정 합 니 다.SQL 문 구 는 다음 과 같 습 니 다.4.group 을 이용 합 니 다. 효율 성 향상

좋은 웹페이지 즐겨찾기