--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 타다키치
,

요구사항:

rownum, 글제목, 댓글수, 글쓴이, 최근 수정 시간(년월일로, 당일 댓글이 달리면 new라고 표시)

이 들어간 테이블을 만들기



내가 한것(쓸 수가 없는 수준)


select rownum rn, bbsno, title, count_rep, writer, replace(to_char(regdate,'yyyymmdd'),'20140911','new') from(

  select bbs.BBSNO bbsno, bbs.TITLE title, count(rep.REPLYNO) count_rep, bbs.WRITER writer, bbs.REGDATE regdate

  from tbl_bbs bbs, tbl_reply rep

  where bbs.BBSNO=rep.BBSNO(+)

  and bbs.BBSNO>0

  group by bbs.BBSNO, bbs.TITLE,  bbs.WRITER, bbs.REGDATE

  order by 1 desc

);


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


선생님이 한 것. 조인을 하기 전에 서브쿼리에서 필요한 행 개수만큼 미리 만들어내는 것이 중요함.


select 

rn, min(bno), min(title), count(reply.bbsno), min(writer), min(replace(to_char(reply.regdate,'yyyymmdd'),'20140912','new'))

from 

  (

  select 

  rn, bno, title, writer, regdate

  from 

    ( select   /*+INDEX_DESC(tbl_bbs pk_bbs) */  rownum rn, bbsno bno, title, writer, regdate 

      from tbl_bbs  

      where bbsno > 0 and rownum <= 20 ) 

  where rn > 0

  ) bbs, tbl_reply reply 

where bbs.bno = reply.bbsno(+) 

group by rn

order by rn;

Posted by 타다키치
,

게시판 만드는  연습 등을 할때 유용하게 쓰이는 방법.

먼저 Sequence를 만들어 글 번호가 자동 생성될 수 있도록 함.



create sequence seq_bbs;


insert into tbl_bbs 

(bbsno, title, content, writer)

values (seq_bbs.nextval, '제목..', '내용..', 'user00');


insert into tbl_bbs

(bbsno, title, content, writer)

( select seq_bbs.nextval, 

  title||seq_bbs.currval, 

  content||seq_bbs.currval, 'user00' 

  from tbl_bbs);

commit;




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

자바에서 쿼리를 만들어 콘솔창에 뜬 결과를 SQL developer에서 전부 실행시킬 수도 있음.



package jdbc;

public class MakeSql {

public static void main(String[] args) {

int max = 1048577;

for (int i = 0; i < 1000; i++) {

int value = (int)(Math.random()*100);

String sql="insert into tbl_reply (REPLYNO, BBSNO, reply, replyer) "

+ "values(seq_reply.nextval,"+(max-value)+ " , '리플...','user01');";

System.out.println(sql);

}

}

}


create SEQUENCE req_reply;


insert into tbl_reply (replyno, bbsno, reply, replyer)

(select seq_reply.nextval, bbsno, reply, replyer from tbl_reply);

commit;

Posted by 타다키치
,