대용량 테이블 삭제 방법
목적
- TMAXSOFT의 티베로 환경 ( 오라클과 유사 ) 에서 실시간으로 업데이트 되고 있는 대용량 테이블의 부분 삭제
문제
- 더이상 테이블 스페이스를 증설할 수 없다.
- 운영(실시간 업데이트)을 중단할 수 없다.
- 해당 TABLE에 DATE 컬럼으로 조건을 걸어 SELECT 하거나 DELETE 하면 시스텡에 부하가 걸린다.
- DB관련 나의 지식이 짧다.
첫번째 시도
그냥 가장 심플한 방법으로 삭제를 시도해 봤다.
DELETE TABLE BIGTABLE
WHERE REGISTDATE < 20160101000000
-- 여기서 REGISTDATE 컬럼은 CHAR 이다.
- 첫번째 결론 : 삭제 쿼리가 도는 도중 시스템에 부하가 걸려 시스템이 제대로 작동하지 않는 문제가 생겼다.
- 추정 원인 : 대량으로 delete 하면 롤백 세그먼트를(Undo) 상당히 많이 먹습니다. 또한 리두로그도 많이 나오게 되겠죠. 이게 퍼포먼스를 꽤 잡아먹을 수 있습니다. 따라서 리두로그는 충분히 크게 설정하여서 너무자주 체크포인트가 발생하지 않도록 신경써주셔야합니다
- 출처 : DATABASESARANG.NET 김주현님 댓글
두번째 시도
복제 테이블 생성 후 기존 테이블을 삭제 하고 복제 테이블 명을 기존 테이블 명으로 변경 하는 방법을 시도해 봤다.
DML(데이터 조작 언어) 이 아닌 DDL(데이터 정의 언어) 을 사용하면 log 가 남지 않으니 부하가 적고 빠르다고 하더라…
CREATE TABLE TEMPBIGTABLE
AS SELECT * FROM BIGTABLE WHERE 1=2
-- 조건에 1=2 와 같이 맞이 않는 조건을 넣으면 ROWS(데이터) 를 제외한 테이블 복사가 이루어진다.
CREATE TABLE TEMPBIGTABLE
AS SELECT * FROM BIGTABLE WHERE REGISTDATE > 20160101000000
-- 남겨야 할 데이터와 함께 테이블을 복사 및 생성 한다.
- 두번째 결론 : 테이블 생성에 성공은 하였으나 NOT NULL외 제약조건과 인덱스는 함께 생성되지 않았다.
- 결론의 결론 : DDL을 추출 해야 한다. 즉, Tibero Admin (토드 같은 툴) 에서 해당 테이블을 Export 해야 한다.
- 결론의 결론의 결론 : Export 하여 추출하는 과정에 인코딩 문제가 있는지 부분적으로 글자 깨짐이 생겼고 해당 쿼리는 당연히 돌아가지 않았다.
세번째 시도
마음은 급하고 답은 안나와서 그 외에 용량을 차지하지만 테이블 데이터 전체 삭제가 가능한 테이블을 찾아 삭제 하였다.
DELETE TABLE ANOTHERBIGTABLE
-- 이런식으로 하면 시간이 매우 오래 걸린다.
TRUNCATE TABLE ANOTHERBIGTABLE
-- 요렇게 하면 빠르게 삭제가 가능하다.
- 세번째 결론 : 임시로 한 방법이라 해결했다고 볼 수는 없다 but 공간 확보는 성공 했다.
아직 못해본 시도
분명 방법은 있을거라 생각해서 구글링 하다 나온 아직 시도해보지 못한 방법을 몇가지 링크로 걸어봤다.
- Database Sync : PL/SQL 을 이용하여 데이터를 삭제하는 가운데 commit 이 실행 되도록 하는 방법이 나와있다.
- Ecyclone : 다양한 방법과 자세한 설명이 있다.
마치며…
임시 방편으로 해결은 했으나 결론이 난것은 아니라 계속 방법을 찾아보고 결론이 나온다면 그 방법을 포스팅 하겠다.
나름 여러 지인분들께 묻고 방법을 찾아봤으나 뚜렷한 방법은 나오지 않았으며…
빨리 티베로에서 한분 오셔서 월별로 파티션 분할 좀 시켜주시고 방법도 상세히 알려주시면 좋겠다.
'Programming > SQL' 카테고리의 다른 글
9. 연습(3) (0) | 2017.03.11 |
---|---|
8. 연습(2) (0) | 2017.03.11 |
7. 연습(1) (0) | 2017.03.11 |
6. 실습(4) - SubQuery (0) | 2017.02.28 |
5. 실습(3) - Join (0) | 2017.02.28 |