대용량 데이터베이스 조회관련 질문

현재 순수 자바 응용프로그램을 짜고있는데요.. (JDK1.4.2)

조언이 좀 필요합니다.....

총 218개의 테이블중에 2개의 테이블 대상으로....

테이블 TB_RDFR에 FR_ID(PK), OG_NO, CT_YEAR, 외 80여개 컬럼이 있구요.

테이블 TB_RDRD에 RD_ID(PK), FR_ID 외 50여개의 컬럼이 있습니다.

테스트 DB에 TB_RDFR에는 약3,800개의 데이터가 들어있고요..

TB_RDRD에는 약 121,000개의 데이터가 들어있습니다.

(테스트DB이기에 실제DB에서는 훨씬 더 늘어날 가능성이 높습니다)

출력으로는

TB_RDFR 테이블에서.. 중복을 제외한 OG_NO 값,

TB_RDFR 테이블에서.. 중복을 제외한 OG_NO 각각의 값에 속한 중복을 제외한 CT_YEAR값,

TB_RDFR 테이블에서.. 위에 두 값(뽑아낸 OG_NO, 뽑아낸 CT_YEAR)이 동일한 FR_ID의 개수들의 합,

TB_RDRD테이블에서.. 위의 두 값(뽑아낸 OG_NO, 뽑아낸 CT_YEAR)이 동일한 각각의 FR_ID를 컬럼으로 가지는 RD_ID의 개수들의 합.

이렇게 4가지 항목이 한줄이 되어, txt파일로 출력이 되도록 하고있습니다.

현재 테스트해본 결과로는.. 173줄이 나오는데요..

저걸 3중 for문을 사용해서 그안에서 매번 DB에 connection을 하고 그 값을 가져다가 쓰는 방식으로 했더니..

DB 커넥션 3840회, 소요시간 519.485초 라는 어마어마한 결과가 나오네요... -0-

DB는 오라클9i사용하고요 로컬 DB는 아닙니다만.. 이쪽 컴은 나쁘지않은 수준입니다.. 팬터엄 2.5GHz 듀얼에 램2기가 노트북이니깐요..

문제가.. (DB커넥션으로 인한?) 소요시간이 너무 오래 걸린다는 점인데요...

그냥 말마따나.. 두개의 테이블의 데이터를 통채로 긁어다가 2차원 벡터에 넣어놓고 내부에서 돌려서 뽑아버리면

커넥션은 2번이면 끝날거 같긴한데.. 소요시간이 얼마나 줄어들지 모르겠고.. 메모리 잡아먹는게 감당이 될지 어떨지.. 아직은 상상뿐이지만.. (아직 그렇게는 안짰거든요.) 좀 두려워지네요..

대용량 DB 다뤄보신 경험있으신 고수 프로그래머님들께서..

저러한 경우 어떻게 해야 시스템 자원 적게 먹으면서 빠르게 처리할 수 있는지 강력한 조언좀 부탁드립니다.

참고로 제가 사용한 sql문은 밑에 있습니다.

sql = "select distinct OG_NO from TB_RDFR order by OG_NO";

sql = "select distinct CT_YEAR from TB_RDFR where OG_NO = '" + inputOgCd + "' order by CT_YEAR";

sql = "select FR_ID from TB_RDFR where OG_NO = '" + inputOgCd + "' and CT_YEAR = '" + inputCtYear + "' order by FR_ID";

sql = "select RD_ID from TB_RDRD where FR_ID = '" + inputFrId + "' order by RD_ID";

ps. RD_ID의 개수들의 합. <== 이거 뽑아낼때 count(RD_ID) 사용하면 안됩니다.. 원래 저 뒤에 하나 더 붙어 5가지 뽑아내야 하거든요.. RD_ID를 사용해서 또 비교해서요.. 거긴 아직 빼먹은 부분이라.. 하지만 해야하므로..

신고

의견 1

질문자 채택된 경우, 추가 답변 등록이 불가합니다.

re: 대용량 데이터베이스 조회관련 질문..!!!

질문자인사 1번은 한번 해봐야겠네요. 튜닝할때. 음. 4번은 저랑 상관없는.. 나중에.. 두번만에 통짜로 메모리에 올려놓고 처리했더니 전체조회 2번만에 프로그램이 뻗어버리네요.. 아웃 오브 메모리 익셉션. 일단 반반씩 부담을 가게 짜놓은 상태입니다.. 메모리 오버 에러도 확실히 안나는.. 근데 12시간 출력 테스트에 전체데이터의 반도 못뽑아냈..

안녕하세요

음 디비쪽을 좀 건드리면 될것 같내요

일단 쿼리를 보니 join을 전혀 안쓰셨는데 이유라도 있나요?

일단 join을 써서 필요한 데이터만 한방에 가져오는 방법이 있겠내요

퀴리를 잘 짜보시면 한방에도 가능 할것 같내요

두번째 방법은 인덱스를 확인해 보세요

where 절에 있는 애들은 인댁스가 있을수록 그 검색 결과는 빨라지니까 하지만 용량등등 고려 하시면서 인덱스를 만드세요

그리고 끝에 전부 ORDER BY 가 있는데 꼭 필요한거인가요?

결과를 모두 뽑아내서 합친다음 order by 하는게 더 빠를것 같내요

아무래도 정렬을 하게 되면 느리니까.

그리고 최후의 방법은 스케줄러를 사용하는 방법입니다.

저 정보를 실시간으로 보는것이 아니라면 하루에 한번 혹은 1시간에 한번씩 스케줄러를 돌려서

테이블에 필요한 데이터만 밀어 넣습니다.

그리고 프로그램단에서는 그테이블만 가져다가 보여주면 되겠죠

이정도면 해결 할수 있을것 같습니다.

+ Recent posts