안녕하세요.
저는 현재 보험 계약 데이터에서 보험 해약율을 구하기 위해서 MySQL을 이용하고 있습니다.
하지만 DB 설계에 대한 경험이 없어서 성능이 잘 나오지 않네요.
현재 DB에는 160만건 정도의 data가 들어있고 그 형태는 다음과 같습니다.
CREATE TABLE TEMP (
rcd INT, <== 계약일(date가 아니라 현재는 integer 형으로)
ANP INT, <== 보험료
premium INT,
statcode CHAR(5), <== 보험상태(해약, 사망, 유지 등)
prodtype INT,
policy TINYINT,
rcd_ym MEDIUMINT,
prod_gb CHAR(20),
Class_Par CHAR(10),
n_Prod CHAR(30),
n_code CHAR(20));
계약일과 보험상태를 where에서 가장 많이 사용하기 때문에 index를 걸어두었습니다. 그리고 다음과 같이 query를 씁니다.
select sum(ANP), sum(policy) from TEMP where (rcd > 19960500 and rcd < 19960600) and (statcode != 'CI' and statcode != 'DC');
즉, 주어진 기간과 상태에 부합하는 보험료의 총합과 보험계약의 갯수를 구하는 것입니다.
문제는 보험상태와 계약일의 중복도가 굉장히 심합니다. 같은 계약일에 같은 보험상태를 가지는 data가 굉장히 많네요.
그래서인지 index를 설정하더라도 속도가 굉장히 느립니다.
월별로 (rcd > 19960500 and rcd < 19960600) 쿼리를 해서 122달치 쿼리를 돌리면 약 1분이 걸리네요.
이를 어떻게 해결해야 할지 감이 오지 않아서 고수님들의 도움을 구했으면 좋겠습니다. 상태별로 table을 나누어야 하는 것인지 아니면
인덱스 설정을 좀 더 효율적으로 해야하는 것인지가 감이 오지 않습니다.
미리 감사드리며 이만...
|