database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 21749 게시물 읽기
No. 21749
대용량 테이블에서 delete 는 어떻게 하나요.?
작성자
룰루
작성일
2005-02-16 11:09ⓒ
2005-02-16 11:10ⓜ
조회수
9,377

안녕하세요 오라클 초보입니다..

 

AS3.0 에 Oracle 9i 를 사용중이구요..

 

테이블에 200만건의 데이타가 있습니다...

근데..그중에 일부의 데이타를 지우려고 합니다

다음과 같은 퀴리문으로

 

delete from 테이블이름 where A is null

 

A라는 컬럼에 인덱스가 설정되어 있는 상태구요.

A가 Null인 데이타는 200만건중 50만건 정도 됩니다.

지금 백업된 오라클 서버에서 테스트로 실행해 보고 문제가 없을시

 

현 운행중인 서버에서 삭제를 시도하려고 합니다.

명령후 하루가 지났는데도 완료가 되지 않네요.

 

어떻게 하면 효율적으로 데아타를 빨리 지울수 있을까요.?

 

부탁입니다..많은 고견 부탁드리겠습니다.

 

감사합니다..

 

이 글에 대한 댓글이 총 5건 있습니다.

오라클에서 null은 인덱스에 포함되지 않으므로 is null 조건은 인덱스를 탈 수가 없습니다.

 

그리고 위의 경우 200만건에서 50만건을 지운다고 하셨으므로 이 경우 index를 타면 오히려 더 비효율적입니다. Table full scan을 해야죠.

 

 

참고로 대량으로 delete 하면 롤백 세그먼트를(Undo) 상당히 많이 먹습니다. 또한 리두로그도 많이 나오게 되겠죠. 이게 퍼포먼스를 꽤 잡아먹을 수 있습니다. 따라서 리두로그는 충분히 크게 설정하여서 너무자주 체크포인트가 발생하지 않도록 신경써주셔야합니다.

김주현님이 2005-02-16 11:55에 작성한 댓글입니다. Edit

운영시스템이라 부하가 많이 갈수 있다면, 다른조건을 주어서 여러번에 나누워 작업하는것도 좋은생각입니다.

 

잠시 운영을 멈출수 있다면, 동일한 테이블을 만들고, 그곳에 insert작업을 한후에 원래 테이블을 삭제하고 새로운테이블을 rename 시키는 것도 한방법입니다.

장종훈(우연을가장한인연)님이 2005-02-16 12:55에 작성한 댓글입니다.

200만건 중에서 50만건을 지울경우

저는 이렇게 했을것 같습니다.

create table aaa

as

select * from 테이블이름 where a > ''

 

기존 테이블을 drop하고 새로 만들어진 테이블을 기존 테이블 이름으로 변경하는 것이 좋을 듯 합니다.

 

위의 문장은 DML문장이 아니라 DDL문장이므로 log가 남지 않으니

까요.

 

만약, 서버에 CPU가 여러개일 경우 parallel degree 옵션을 이용하는 것도 좋은 방법인 듯 합니다.

create table aaa

as

select * from 테이블이름 where a > ''

parallel degree 4 <-- init.ora파일에 parallel 옵션 설정이 enable되어야 합니다.

지현철(jhc6703)님이 2005-02-16 18:03에 작성한 댓글입니다.

50만건을 지우는 일량과 150만건을 생성하는 일량을 비교해보세요.

이 경우 과연 CTAS를 쓰는게 좋은 방법일까요?

또한 인덱스도 다시 생성하는 오버헤드와 만약 테이블에 부속된 constraints와 view, trigger 등도 문제가 될 수 있습니다.

 

물론 nologging 으로 리두 생성을 줄일 수 있지만 위의 테이블은 분명히 복구가 아주 중요할 것으로 판단되는바 nologging을 쓰실 수 없습니다.

 

 

김주현님이 2005-02-16 21:50에 작성한 댓글입니다. Edit

답변 감사합니다...^^

 

다음과 같은 방법은로 깔끔하게 처리가 되었습니다..

 

create table aaa

as

select * from 테이블이름 where A is not null

 

위의 쿼리로 새로운 테이블을 생성한후 기존의 테이블을 지우고

새로운 테이블의 이름을 기존의 테이블 이름으로 변경했습니다..

 

룰루님이 2005-02-17 10:57에 작성한 댓글입니다.
이 댓글은 2005-02-17 10:58에 마지막으로 수정되었습니다. Edit
[Top]
No.
제목
작성자
작성일
조회
21752[질문] NOT IN, IN, <> 중에 뭐가 더 빠를까요? [3]
서지수
2005-02-16
2623
21751select문인데도 execute 단계의 rows에 숫자가 나오는 경우는 ?
data
2005-02-16
1337
21750update를 할때 여러건을 하면 이상현상이 있어요.
질문
2005-02-16
1398
21749대용량 테이블에서 delete 는 어떻게 하나요.? [5]
룰루
2005-02-16
9377
21747시퀀스 백업방법좀 갈켜주세여....ㅠㅠ [1]
왕초짜
2005-02-15
3548
21745쿼리한 값이 없어도 값을 표현하고 싶을때 [3]
손님
2005-02-15
2548
21744제수로 나누기... [1]
이정택
2005-02-15
2517
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다