대용량 데이터 통계 어떻게 시간단축 할 수 있는지 좀 알려주세요ㅜ 0 5 4,719

by 베이스쟁이 대용량 통계 [2008.09.08 16:50:18]


SELECT CONTENT_CODE,COUNT(CONTENT_CODE) FROM AAA
WHERE REGDATE BETWEEN TO_DATE(STARTDATE) AND TO_DATE(ENDDATE)
GROUP BY CONTENT_CODE

이런식으로 기간별 데이터를 가져옵니다. 근데 문제는 데이터량이 천만이 넘어서
상당한 시간이 걸립니다. 많은 데이터량이기 때문에 그렇게 짧게는 못가져오겠지만 그래도 어느정도나마
시간을 줄이고 싶은데 방법이 있을까요?

페이지뷰를 구하는것인데 어떻게 해야할지;;;; 도움 부탁드립니다..ㅜㅜ

디비는 오라클8i입니다. ;;

by 호야 [2008.09.08 17:20:14]
당연히 REGDATE의 INDEX는 DESC로 되어 있겠죠?....
어차피 통계가 오래전 통계부터 들어 가는게 없기 때문에 최신정보를
위로 오게끔 하는게 맞다고 생각하구요...
전문가가 아니라서.... ASC인덱스로 잡혀 있다면...
INDEX_DESC(테이블, REGDATE인덱스명) 힌트를 써서 검색을 하실때
조금이라도 도움이 되겠네요

by 현 [2008.09.08 17:33:11]
네..일단 대용량 데이터를 빠른 시간에 access하기 위해선
인덱스 스캔을 하거나 부분범위 처리를 해야 합니다.
님께서 작성하신 쿼리는 GROUP BY 가 있으므로 부분범위 처리는 힘들 듯 하네요.
그렇다면 조회하는 데이터를 줄이는 방법을 강구 하셔야 합니다.
REGDATE 컬럼에는 인덱스가 있어야 하고,
페이지 뷰를 구하는 것이라면 전체를 다 읽지 않고 몇건만 끊을 수 있을꺼 같은데요...
전체를 읽지 않고 해당 조건에 있는 데이터 들만 읽어서 페이지당 끊으면 그리 오래 걸리지 않을 수도 있겠네요..

by finecomp [2008.09.08 17:38:10]
위 질문만으로는 튜닝 방향을 정하기가 거의 불가합니다만
날짜 조건으로 access되는 데이터가 천만건이 넘는다는 가정하에
REGDATE + CONTENT_CODE 로 인덱스가 존재하면 테이블 I/O없이도 가져올 수 있는 쿼리가 되어 성능개선이 될 수 있겠습니다.

또한 페이지뷰(?)는 무엇을 기준으로 페이지당 얼만큼 씩 가져오는지도 안써있으니 판단조차 할 수가 없네요.
아무튼 이것도 인덱스scan + ROWNUM Stopkey를 이용한 인덱스 부분범위처리로 가져오는 것이 일반적인 방법입니다.

by 베이스쟁이 [2008.09.08 18:28:55]
답변 감사합니다.^^ 인덱스가 존재하지 않아..인덱스를 생성하려고 하니
ORA-01650: unable to extend temp segment by 2048 in tablespace 테이블명
위와같은 에러메시지를 띄우면서 멈춰버리네요..ㅜㅜ 기존데이터가 많아서 그런거 같은데 이럴경우는 어떻게 해야 할까요? 초보라서 죄송합니다..ㅜ

by 현 [2008.09.08 18:43:51]
테이블스페이스 공간을 늘려주세요..
일반적으로 인덱스는 테이블과는 별도의 테이블스페이스에 만드니까
원래 어느 테이블스페이스에 인덱스를 만드는지 확인하시고 그 테이블스페이스에 생성하세요....
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입