2011년 6월 1일 수요일

9백만건을 가진 테이블 검색을 위한 튜닝

다음은 OTN에 올라온 질문입니다.
질문
select 일자,,,,
from 시평T_채권평가회사단가
where 일자 >= ''20030504''
and 일자 <= ''20040504''
and 종목 in (''KR1015014K57'',''KR1015014K65'',''KR1015014K73'')
group by 일자

위 테이블이 9백만건을 가진 테이블입니다..
위와 같이 group by 일자 를 하면
일자의 Range만큼 속도가 오래 걸립니다..
위 작업을 수행하는데 13초가 걸리는데 더 빨리 나오게 할 수는 없나요?


답변 1
우선 전체건수는 9백만건이고
검색되는 건수는 얼마인지 모르겠네요..
아시다시피 10%내의 선택도를 가져야만 인덱스검색시 효과적이라고 하니
건수부터 알아야겠고.. 그리고 종목이라는 컬럼의 분포도가 높은 지 아닌지도
알아야겠고, 검색하는 건수에 따라서 13초가 빠른것인지 아닌지 판단이
가능하겠습니다. 건수와 무관하게 (종목,일자)로 결합인덱스를 만들어
테스트 해 보심 좋겟네요


답변 2
상기 내용만으로 판단할때,
인덱스는 일자+종목순으로 걸려 있어야 합니다.
또한, optimizing이 cost-base로 수행될 수 있도록 하는게 좋겠네요.
참고로, in 조건은 or 조건과 동일하므로,
상기 query는 해당 테이블을 3번 조회하게 됩니다.
가능한 종목 수가 많지 않다면, 역으로 and 조건으로 변경할 수도 있겠네요.
ex) and 종목 <> ''KR...'' AND 종목 <> ''KR..'' AND ..


답변 3
Table Partition 하세요..
종목 값의 선택성이 얼마인지 몰라 종목으로 말씀드리기는 어렵고...
일자는 월단위로 하시면 되겠고요... \
종목도 가능하면 종목+일자 또는 일자+종목 으로 Partitioning 하시고
통계정보 갱신하시고 수행해 보세요...


답변 4
우선 일자와 종목 인덱스가 걸려있는지 플랜 해보시고여
풀스캔이 걸린다면 비율확인해서 인덱스 생성해야 합니다.
그리고 쿼리문에서 종목과 일자를 보니 정확한 답을 얻을 수 없을것 같군여
만약에 종목과 일자를 정확히 알 수 있다면 쿼리를 약간 바꾸는 것이 나을 수 있
겠네여.
날짜 조회를 다른 수치로 조회할 수 있는여부와
in -> between ...and 으로 바꾸면 속도가 향상되리라 생각됩니다.
그리고도 속도 수행이 나아지지 않으면 table analyze 해보심 옵티마이저가
더 효율적으로 수행 할 수 있습니다.
위 방법도 소용없다면 테이블을 월(년)단위로 파티션하는것이 좋을 겁니다.


답변 5
1.먼저 종목코드로 검색되는 건수가 얼마되는지 체크
2.날짜보다 레인지가 좁혀졌다면 그리고 몇개 안되면서 고정적이라면
종목별로 SELECT후 union으로 처리하면 괜찮습니다
select
from t1
where 날짜 between ''1'' and ''2''
and 종목코드 = ''KR1''
union
select
from t1
where 날짜 between ''1'' and ''2''
and 종목코드 = ''KR2''

이런식으로 한후 전체를 GROUP BY를 하면 괜찮구요(천만건 이상 자료검색으로
검증했습니다^^)
900만건중 선택되어지는 데이타량이 상당하면 차라리 FULL scand이 좋습니다.

댓글 없음:

댓글 쓰기

블록체인 개요 및 오픈소스 동향

블록체인(block chain) 블록체인은 공공 거래장부이며 가상 화폐로 거래할때 발생할때 발생할 수 있는 해킹을 막는 기술. 분산 데이터베이스의 한 형태로, 지속적으로 성장하는 데이터 기록 리스트로서 분산 노드의 운영자에 의한 임의 조작이 불가...