월별테이블을 UNION한 뷰테이블에서 INSERT 0 3 1,592

by 블루블랙까마귀 [SQL Query] [2015.01.09 14:39:18]


 

안녕하세요 ^^

궁금한 점이 생겨 질문드립니다.

 

저희가 기존에는 통계데이터를 CALL_TABLE이라는 하나의 테이블에 넣었습니다.

 

그런데 문제가 데이터양이 워낙많다보니

테이블스페이스를 32GB씩 빈번하게 확장해줘야하는데

디스크 용량의 한계가 있기 때문에 무제한으로 확장하는데도 한계가 있다고 생각하여

일정기간의 데이터를 유지하고 delete를 해주기로하였습니다.

 

그런데 delete를 해주더라도 테이블스페이스의 용량은 줄어들지 않더라구요,

만약 delete로 테이블스페이스의 용량을 줄이려면 SHRINK를 해주거나

또는 Trunkcate를 해줘야만 테이블스페이스 용량이 줄어드는데,,

 

그래서 생각한게 테이블을 월별테이블로 나누고

일정기간 이전 테이블은 trunkcate를 하기로 하였습니다.

 

구조는 다음과 같습니다.

 

CREATE OR REPLACE FORCE VIEW "CALL_TABLE" (...)

SELECT ... FROM CALL_TABLE_01

UNIONALL

SELECT ... FROM CALL_TABLE_02

...

SELECT ... FROM CALL_TABLE_12

이제 CALL_TABLE이라는 뷰에 INSERT 및 UPDATE작업을 해줘야하는데,,

 

INSERT CALL_TABLE VALUE(...); 를 하였을때

해당 월에 맞게 데이터를 넣으려면

뷰테이블을 어떻게 수정하면 될지가 잘 모르겠습니다.

 

방법1 

뷰에서 if문이나 case문을 쓴다 (가능한지 모르겠습니다)

if (DATE_TIME == 01)

SELECT * FROM CALL_TABLE_01

if (DATE_TIME == 02)

SELECT * FROM CALL_TABLE_02

 

방법2

UNION 한 각각의 테이블에 WHERE 조건을 준다.

SELECT * FROM CALL_TABLE_01 WEHRE DATE_TIME == 01

SELECT * FROM CALL_TABLE_01 WEHRE DATE_TIME == 02

 

근데 두개의 방법모두 되지를 않네요,,

ORA-01732: 뷰에 대한 데이터 조작이 부적합합니다 오류 ㅠㅠ

 

방법이 없는것일까요?,, 긴글 읽어주셔서 감사합니다.

 

by 마농 [2015.01.09 14:52:09]

1. 우선 최초 선택에 문제가 있는 듯 합니다.
  - Partition Table 이라는 강력하고 편리한 기능이 있는데 이걸 선택 안하셨네요.
  - 이걸 선택하시면 모든 문제가 자연스레 해결될 듯 합니다.
  - http://www.gurubee.net/lecture/1906
2. 자체(?) 파티션 기능을 그대로 유지해 사용하시려면?
  - 뷰에도 트리거를 걸수 있습니다.
  - instead of trigger 를 이용하시면 되겠네요.
  - 단, 오라클 파티션 테이블이 제공하는 기능을 모조리 다 코딩으로 해결해야 한다는 단점이...


by 블루블랙까마귀 [2015.01.09 14:56:20]

제가 써놓고

아 엔터프라이즈버전이 아닌 스탠다드 버전이라 파티션기능은 사용못하는다는거를

댓글다려고했는데 벌서 댓글 달아주셨네요 

조언 감사드립니다.

 

그럼, 파티션분할은 힘들겠구,,

뷰에서 트리거를 거는방법을 검토해봐야겠네여~?!


by 블루블랙까마귀 [2015.01.09 15:06:17]

말씀하신대로 조금 손이 많이 가겠네요 관련정보를 찾아보니 ㅠㅠ

그냥 뷰테이블에서 처리하지않고 

통계데이터를 넣어주는 대상이 직접

월별테이블에 판단해서 넣어줘야할것같네요,,

 

마농님 다시 한번 답변주신거감사합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입