쿼리 속도 문제로 문의드립니다. 0 8 2,150

by um..... [2008.09.29 15:25:45]


SELECT total_infocenter_id,mdno,serviceagency,special_infocenter_name,url
FROM
(
SELECT c.total_infocenter_id,a.mdno,a.serviceagency,b.special_infocenter_name,a.url
, ROW_NUMBER() OVER(PARTITION BY serviceagency ORDER BY DBMS_RANDOM.VALUE) rn
, COUNT(*) OVER(PARTITION BY serviceagency) cnt
FROM metadata a, special_infocenter b, total_infocenter c
where a.dbname!='17' and a.deldate='12345678'
and a.serviceagency!='0765' and a.serviceagency!='3303' and a.serviceagency=b.agency
and b.total_infocenter_id=c.total_infocenter_id
)
WHERE rn / cnt <= 0.01
group by total_infocenter_id,mdno,serviceagency,special_infocenter_name,url
order by total_infocenter_id,serviceagency,mdno

예전에 마농님의 도움에 힘입어 쿼리를 작성했는데 그안에 필요한것들을 넣긴 넣었습니다만..

속도면에서 너무 느린관계로 질문을 드립니다. 인덱스는 다 생성이 되어있는데요

너무 느려서 어떻게 하면 될지.. 방법좀 알려주시면 안될까요? 예전에 비슷한걸로 문의를 드린적이 있는데..

그걸 비교하면서 봐도 전혀 답이 안나오네요,..ㅠㅠ

by 호야 [2008.09.29 16:59:32]
DB에 대한 정보 없이 SQL 튜닝을 한다는것은 어렵습니다. 기본적인 정보 제공
을 해 주세요
metadata a, special_infocenter b, total_infocenter c
테이블들의 정보들
각 테이블의
전체 로우 수, INDEX 걸린 컬럼과 이름, TRACE 정보 등

어떠한 상황인줄은 모르겠지만 여기서 풀릴려면 DELDATE부터
INDEX를 타게 되는데... 이 인덱스를 생성할 경우 DELDATE가
제가 볼때는 분포도가 큰거 같습니다. 저넘이 제일 앞에 위치를 해야
이 SQL은 쉽게 풀릴 듯 합니다. 그리고 A 테이블이 엄청 많은 데이터가
있는거 같습니다. B,C 테이블은 참조형이구요

TRACE를 봐야 드라이빙이나 조인 순서를 알고 힌트를 주어서 풀텐데
지금은 어떻게 정확히 설명을 못드리네요. 강정식님이 오시면 쉽게
풀이 해 주실텐데..ㅋㅋ

by um..... [2008.09.29 18:05:07]
와.. 맞습니다.. 모든 테이블에 인덱스는 거의 설정이 되어있고요, deldate 또한 설정이 되어있습니다.
metadata 테이블안에는 실질적으로 사용되는(deldate='12345678')인자료가 대략 2천만건 총 5천만건의 데이터가 있습니다. B C 테이블은 참조형이 맞고요..
IDX_METADATA_DELDATE_1,IDX_METADATA_SERVICEAGENCY 가 사용될거 같아서 이렇게 빼봤습니다.

그래도 모쪼록 답변 감사드립니다.^^

by 호야 [2008.09.29 18:20:05]
아하 저 정도 자료에 인덱스 생성이라면..-_- 조금 힘드시겠지만...
꼭 인덱스를 걸?? 컬럼 하나만 걸어 두는게 아닙니다... 인덱스를 많이 만들수록
insert,update,delete 할?? 부하가 많이 생기시겠지만. 이 쿼리만으로 봤을때는
꼭 만드실때는 페러럴 걸으세요.. 자료가 많아서 페러럴 안 걸면 오래걸려요
create index idx_metadata_total on metadata(deldate,serviceagency,dbname)

으로 통합 인덱스를 생성 하시면.. 제일 낳은 인덱스가 됩니다

by um..... [2008.09.30 09:07:53]
감사드립니다. 호야님.
인덱스를 통합으로 하나 생성해버렸어요^^

매일 배우고만 가는거 같네요. 감사합니다^^


by 현 [2008.09.30 11:00:07]
호야님 답글에 이의를 제기 합니다.
where 절에서 보면 deldate를 제외하고 serviceagency,dbname는 부정형으로 비교되었기 때문에 인덱스 스캔을 할 수 없습니다.
따라서, 호야님께서 제안하신 인덱스는 별 효용이 없고, deldate로 구성된 인덱스가 효용가치가 높겠네요..

by um..... [2008.09.30 11:38:55]
아.. 부정으로 처리된 곳에서는 인덱스 효용이 없는 것인가요..?
후.. 이것저것 다모르니 헤메기만 하는거 같고.. 다시 찬찬히 강의를 봐야겠네요..
감사합니다^^

by 호야 [2008.09.30 11:41:22]
um님 죄송합니다..-_- 느낌표를 못 보고... 현님의 말씀대로..
결합인덱스는 소용이 없습니다. range scan 을 일으키는데
deldate 혼자 인덱스를 걸으나 결합인덱스를 걸으나 둘다
range scan을 일으 킵니다.. 공간에 대한 배려가 없어지는거기
때문에 부정형이였네요.. 잘못된 정보를 가르켜 드려 죄송합니다
이 상태에서는 deldate만이 인덱스의 활용가치가 높겠네요

by um..... [2008.09.30 13:05:21]
아니에요^^ 덕분에 조금이라도 더 알게 되었는걸요 감사합니다^^
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입