oracle 에서 Index를 이용해서 즉 힌트와 rownum을 이용하여 게시판 작성하기

by 조쉬 posted Dec 08, 2016
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄
oracle 에서 Index를 이용해서 즉 힌트와 rownum을 이용하여 게시판 작성하기

아래 사이트 내용 퍼옴 링크
http://www.wowschool.co.kr/servlet/wowbbsManageServlet?wow_cmd=select&pageCnt=5&Current_page=0&pageListCnt=20&startKey=0&pageUpDown=pageNext&wowbbsType=1010&wowbbsTitle=ORACLE 

보통 인터넷 커뮤니티에서는 거의 대부분 게시판 으로 구성 되여있다
하지만 보통 게시판을 작성하는 방법의 문제점및 개선책을 풀어보겠읍니다

case 1 :

select * from  
(select rownum,name,date,text from tableName where name ='wowschool' order by bbs_no )   
where rownum >=srart_rownum  and rownum < end_rownum


위 방법은 많은은 사이트에서 작성 하는것을 보았읍니다
이것보다 더 이상하게 작성한것도 많이 보았으나  위조건의 장점은 oracle에서 응용 프로그램에게
넘겨주는 값이  주워진 rownum 사이 값만 돌려줌니다

사용 Data 건수가 적을때는 커다란 문제가 없읍니다

하지만 사용 Data 건수가 많을 경우 다음 문제가 발생합니다
=>data 건수가 적으면 위의 sub query  붉은색 부분 sql 부분에 처리를 위하여 sort작업이 메모리 소팅 영역에서 처리 되나
건수가 많으면 메모리에서 처리 못하고  tempary 세그먼트에서 sort 작업을 처리 한다

이런경우 Disk I/O 처리가 많이 발생 성능 저하에 치명적이다
물론 Data 를  메모리에 read 하는 작업도 부하가 든다

위의 붉은 부분 sql 에서 처음 부터 sort된 순서로 원한는 갯수 예를 들면 50개면 처음부터 50 개 읽어
드리는 방법을 연구 해보아야 할것이다

위경우는 전체을 sort 한다음 그중에서  원하는 갯수를  read 했다

case 2 : sort 및 원하는 갯수를 hint와 rownum 을 이용한 처리 

SELECT /*+ INDEX_ASC(A pk_wowbbs ) */   
        BBS_NO,HIT_CNT,TITLE,NAME,INDATE,WRITE_MODE,BBS_MANAGER_NO  
        FROM WOWBBS 
        WHERE BBS_NO > 시작입력값  AND  
                     ROWNUM <= 30  


위 조건은 보통 게시판에서 PAGE를( [1][2][3][4][5])선택시 관련 PAGE선택시 선택된 PAGE에 해당하는 검색 목록을 보여 주는
방법이다  시작입력값과 그리고 목록은 30개 를  SORT 되여있는 INDEX를 사용하여 검색 하라는 명령이다
위 방법은 원하는 목록만 정확히 소팅을 따로 없이 검색해서 결과를 준다


물론 위결과를 처리하기전에 PAGE를 처리해야한다 즉 게시판하단에 보통 
<< [1] [2] [3] [4] [5] [6] >>  이런 방식으로 PAGE를 만드는 방법을 설명하겠읍니다
물론 구현하는 사람마다 차이는 있을수있읍니다
더 좋은 방법이있을수있읍니다  일단 PAGE 처리하는시 PAGE 번호에  현재 PAGE 번호및
시작 KEY를 링크합니다

 if(pageUpDown.equals("pagePrew")){
    /*** pagePrew **/ 
           
         selectSql.append(" SELECT  ROWNUM ord ,Z.key_no key_no,Z.flag flag FROM ");
         selectSql.append(" ( ");
         selectSql.append(" SELECT /*+ INDEX_DESC(A pk_wowbbs ) */   "); 
         selectSql.append(" A.BBS_NO key_no ,mod(rownum,?)  flag  "); 
         selectSql.append(" from wowbbs A ");
         selectSql.append(" where  A.BBS_NO < ? and  ");
         selectSql.append(" rownum   <=  30 * 5   ");
         selectSql.append(" ) Z  "); 
         selectSql.append(" where   Z.flag  = 1 ");   

  }else{
       /*** pageNext **/
         selectSql.append(" SELECT  ROWNUM ord ,Z.key_no key_no,Z.flag flag FROM ");
         selectSql.append(" ( ");
         selectSql.append(" SELECT /*+ INDEX_ASC(A pk_wowbbs ) */   "); 
         selectSql.append(" A.BBS_NO key_no ,mod(rownum,?)  flag  "); 
         selectSql.append(" from wowbbs A ");
         selectSql.append(" where  A.BBS_NO > ? and  ");
         selectSql.append(" rownum   <= 30 * 5 ");
          selectSql.append(" ) Z  "); 
         selectSql.append(" where   Z.flag  = 1 ");    

  위 방법으로 <<  PAGE 선택시  pagePrew   
  >> PAGE 선택시   pageNext  로 검색 해서 PAGE [1] [2] [3] [4] [5] 식으로 시작 KEY를 구하여 링크 잡이 놓는다
위조건은 INDEX생성시  BBS_NO 를 중심으로 KEY를 만들었고 ROWNUM은 검색 순서로
INDEX만 가지고 PAGE를 만들수있다
30은 한 PAGE에서 보여 줄수있는 목록수이고 5는 PAGE 번호 [1] [2] [3] [4] [5] 만큼이다

위조건에서 검색해서 나온 결과로 PAGE LINK 작업 현제 PAGE등 계산이 필요하다
일정시점에서 시간이있을때 WOWSCHOOL 계시판을 공개하겠 읍니다 정리후
위조건에거 추가 검색조건들 응용이 필요할것입니다


Articles

1 2 3 4 5 6 7