★★ 대용량 테이블 설계 조언을 구합니다. ★★ 0 1 3,333

by 홍동석 [DB 모델링/설계] 테이블구조 대용량 설계 [2012.10.15 11:15:19]


안녕하세요. 고수님들의 의견을 여쭙고자 글을 씁니다. 많은 조언 부탁드립니다.


1) 상황 : SMS(문자)를 발송하는 프로젝트인데요, 월 발송은 약 100~200만건 정도로 예상합니다. 
발송 에이전트 회사에서 제공하는 기본 테이블 즉 입력테이블, 로그 테이블이 존재합니다.
이 로그 테이블은 월(YYYYMM)별로 자동 생성되도록 되어 있습니다.


2) 기능 
    2-1) 발송내역 리스트를 확인할 수 있어야 합니다.
    2-2) 검색이 가능해야 합니다. 보낸번호, 받는번호, 보낸내용, 날짜 검색이 가능해야 합니다.
    


3) 질문

위와 같은 상황에서 리스트를 보여줄 때나 검색시 속도 면에서 최고의 성능을 보여줄 수 있는 테이블 설계에 대해
조언을 구합니다.

제가 구성할려는 방법은 아래와 같습니다.

    3-1)
-고객이 문자를 발송하면 발송내역 테이블에 등록
발송내역 번호(KEY), 보낸번호, 받는번호, 내용, 건수, 성공, 실패, 구분(SMS,LMS), 날짜
-고객이 문자 발송하면 등록되는 발송내역 테이블의 키 값을 에이전트사 테이블에 등록
(에이전트사 발송 테이블은 여분 필드가 있습니다. 이 여분 필드(5개 존재) 에 들어간 데이터는
자동으로 로그 테이블에도 들어옵니다.

위와 같은 프로세스로 구성을 하고 조회시에 발송내역 테이블을 보여주면 될거 같습니다.
(이 발송내역 테이블은 최근 3개월 이후는 삭제할 계획입니다.)
발송내역 테이블을 조회할 경우에는 큰 문제는 없을거로 생각됩니다(본인)
그런데 문제는 검색시 받는번호가 문제입니다.


만약 발송시 '안녕하세요' 내용으로 100명에게 보냈다면, 각 100명의 받는번호 가운데서 
하나의 받는번호로만 검색이 가능해야 합니다.
위와 같은 설계대로면, 발송내역  에이전트로그 테이블(월별)을 조인하여 검색해야 될거로 보이구요,
더 문제는 기간을 3개월 이런식으로 하게 되면, 테이블이(월별) 다르기 때문에 또 문제가 될거 같습니다.
여러 테이블을 조인해야 되는 문제...등으로 느려질거 같습니다.

물론 성공/실패는 데몬이나 다른 방법으로 업데이트를 하면 되고, 검색시 내용이나 보낸 번호는 발송내역 
테이블을 검색하면 별 문제는 없을거 같은데... 받는번호 검색시가 참 난감합니다.

발송내역 테이블과 더불어 발송상세 테이블을 별도로 하나 더 만들어서 조회를 하도록 해야하는지..
고수님들의 의견과 조언을 구합니다.
(발송내역이던 발송상세이던 3개월을 기준으로 데이터를 삭제할 예정인데, 이 부분도 데몬으로 하는게
좋을지 DB스케쥴로 하는게 좋을지도 궁금하네요..)
더불어 위와 같은 리스트를 보여줄 때 더 효과적인 페이징 쿼리가 있다면 조언 부탁드립니다.

by 오케클릭 [2012.10.15 16:45:03]

발송내역 테이블 A, 발송상세 테이블 B 이렇게 만드는것이 좋을듯 싶네요~
발송번호 검색은 B를 검색해서 A를 찾으면 될듯 싶고요~ 발송번호 필드 INDEX 걸고요~
3개월단위로 데이터 지우는 작업은...그냥 DB 스케줄잡(프로시저 호출)으로 일배치 돌리면서 3개월 이전 데이터 삭제 하시면 되겠네요~

프로시저 내용
매월 1일일때만 실행되도록 조건을 체크 : 참고 TO_CHAR(SYSDATE,'DD') 이게 '01' 일때만
DELETE FROM 발송상세
WHERE KEY IN (SELECT KEY FROM 발송내역 WHERE 날짜 < ADD_MONTHS(SYSDATE,-3))

DELETE FROM 발송내역
WHERE 날짜 < ADD_MONTHS(SYSDATE,-3)
이런정도로 만들면 될듯 싶고요

발송번호 검색은
SELECT 보여주고자 하는 것 FROM 발송내역
WHERE KEY IN (SELECT KEY FROM 발송상세 WHERE 발송번호 = 'XXXXXX')

이정도면 될듯보입니다.

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