--1 조인만 되어 있는 상태. 힌트도 쓰지 않고 tbl_reply에 인덱스도 없어 너무 오래 걸림

select

bbs.bbsno, min(title), count(replyno)

from

tbl_bbs bbs, tbl_reply reply

where bbs.bbsno = reply.bbsno(+)

group by bbs.bbsno

order by bbs.bbsno desc;



------------------------------------------------------------------------------------------------

검색 속도를 높이기 위해 tbl_reply에 인덱스를 추가. BBSNO 역순으로 정렬하므로  인덱스도 다음과 같이 만들어 줘야 함.

create index idx_reply_bbs on tbl_reply(bbsno desc);


다음과 같이 인덱스를 주면 Full Scan이 걸려서 별 도움이 안됨. Drop후 다시 만들어야 함.

create index idx_reply_bbs on tbl_reply(bbsno);

drop index idx_reply_bbs;




--2 힌트를 줘서 BBSNO 역순으로 자료가 나오도록 호출.

select

bbs.bbsno, min(title), count(replyno)

from

  (select /*+ INDEX_DESC(tbl_bbs PK_BBS) */  *

  from tbl_bbs

  where rownum<=20 and bbsno>0) bbs, tbl_reply reply

where bbs.bbsno = reply.bbsno(+)

group by bbs.bbsno;




--3 힌트 대신 BBSNO 기준으로 Order By 해줌. 거의 차이가 없음. 

select

bbs.bbsno, min(title), count(replyno)

from

  (select

  *

  from

  tbl_bbs bbs

  where rownum<=20 and bbsno>0 order by bbs.BBSNO desc) bbs, tbl_reply reply

where bbs.bbsno = reply.bbsno(+)

group by bbs.bbsno;



--4 tbl_reply 테이블을 서브쿼리로 만듦. 시간은 오히려 더 걸림

select

bbs.bbsno, min(title), count(replyno)

from

  (select /*+ INDEX_DESC(tbl_bbs PK_BBS) */  *

  from tbl_bbs

  where rownum<=20 and bbsno>0) bbs, 

  (select /*+ INDEX(tbl_reply idx_reply_bbs) */* from tbl_reply where bbsno>0) reply

where bbs.bbsno = reply.bbsno(+)

group by bbs.bbsno;


select

bbs.bbsno, min(title), count(replyno)

from

  (select /*+ INDEX_DESC(tbl_bbs PK_BBS) */  *

  from tbl_bbs

  where rownum<=20 and bbsno>0) bbs, 

  (select * from tbl_reply where bbsno>0) reply

where bbs.bbsno = reply.bbsno(+)

group by bbs.bbsno

order by bbs.bbsno desc;





-----------------------------------------------------------------------

Join되는 댓글 수를 줄임. 안해도 됨.

update tbl_reply set bbsno = bbsno-replyno;

Posted by 타다키치

댓글을 달아 주세요