방랑로그

[oracle] simple 부분범위처리 본문

IT개발/DBMS

[oracle] simple 부분범위처리

야키다 2017. 12. 15. 17:23

[oracle] simple 부분범위처리 




해당 Page의 행번호 :rowFrom ~ :rowTo일때




select ORD_NO, GOOD_CODE, ORD_CFMDATE, DANO_MV, DANO_HP
 from ( select rownum rn, v.* from
   ( SELECT ORD_NO, GOOD_CODE, ORD_CFMDATE, DANO_MV, DANO_HP
       FROM OR_ORD1S
       ORDER BY ORD_NO ) v


     where rownum <=  :rowTo )
 where rn >= :rowFrom










일단 오라클은 Limit 없습니다. 단순하게만 생각하면 페이지 처리는 rownum으로 대치하는게 가장 비슷합니다.


SELECT *


FROM(   

    SELECT ROWNUM AS rn, a.*


    FROM(


        SELECT * FROM board  ORDER BY ref desc, re_step asc


        ) a


    )


WHERE rn BETWEEN ? AND ?




하지만 MySQL에서는 페이지 처리 시 order by...Limit 처럼 일단 전체범위를 Access하여 sort하고 잘라버리는 비효율적인 방법 외에는 페이징방법이 없습니다.




오라클은 이런 경우 인덱스 부분범위처리방법을 이용하여 페이징처리 시 비약적인 성능향상을 꾀 할 수 있습니다.


MySQL과 오라클은 근본은 RDB로 같지만 대용량을 지원하는 솔루션의 깊이는 다르다는 말입니다.오라클을 쓰려면 오라클에 맞게 이론 및 원리를 숙지하고 사용하는게 맞다고 생각합니다.


보통 데이터 건수가 비교적 많아서 페이지 처리를 하려고 하는 것인데 전체를 access하고 sort하는 방법은 분명히 서버에 많은 부담을 주는 처리방법임을 명심하세요.




"인덱스부분범위 처리"의 기본적인 절차는 아래와 같습니다. 참고하세요.


1. 테이블에 ref desc, re_step asc로 시작하는 인덱스가 있는지 확인하고 없다면 이런 인덱스를 (a_idx라고 가정) 만든다.


2. 옵티마이저 힌트를 사용하여 이 인덱스로 access path를 유도하여 rownum의 방법으로 인덱스만 부분범위로 scan하여 가져온다.




직관적인 이해를 위해 입력변수를 :start, :end로 만들겠습니다.


인덱스 부분범위처리방법의 쿼리예시는 아래와 같습니다.


SELECT *


FROM(


    SELECT /*+ INDEX(a a_idx) */ --> 옵티마이저힌트


        ROWNUM as rn, a.*


    FROM board a


    WHERE ROWNUM <= :end --> scan stopkey 처리...이 때문에 부분범위로 되는 것임.


    )


WHERE rn BETWEEN :start AND :end --> 주의 : 오라클 psuedo-column인 rownum은 항상 1을 포함하여야 하기 때문에 안에서 rn처럼 구체적인 컬럼으로 만들어 밖에서 나머지 조건들을 filtering해야 함.




order by 등의 구문이 없으니 대량데이터의 sort가 없어 훨씬 효율적인 방법입니다.






참고) BETWEEN ? AND ?의 start와 end 구하기


int currentPage = 1;                   // 현재페이지

int ItemCountPerOnePage  = 10;  // 한페이지 보여줄 목록 개수


int end   = currentPage * ItemCountPerOnePage;

int start = end - (ItemCountPerOnePage - 1);


'IT개발 > DBMS' 카테고리의 다른 글

[mssql] 실행계획  (0) 2017.12.15
[mysql] Explain  (0) 2017.12.15
[sql,oracle,informix] sql비교  (0) 2017.12.15
[mysql] replication2  (0) 2017.12.15
[mysql] replication1  (0) 2017.12.15
Comments