본문 바로가기

DataBase/Oracle

[퍼옴]페이징 기법

자바에서 개발하면서 페이지처리에 대한 기준을 만들고자 정리 하였습니다.

프로그램에서는 SQL 그대로 작성해 주고, 페이지 처리는 SQL 유틸에서 파싱하면 될 것입니다.

물론, SQL 유틸은 프로젝트 팀에서 별도로 만들던가, 프레임웍을 도입해서 사용하면 되겠죠.

<< 참조 페이지 >>

http://asktom.oracle.com/pls/ask/f?p=4950:8:4364635541175556421::NO::F4950_P8_DISPLAYID,F4950_P8_CRITERIA:76812348057

사전사항.

1. Sorting이 없을 경우 가능하다면 Sorting 하지 않도록 합니다.
2. 메인 SQL에서 SELECT ROWNUM NUM은 SQL작성 시 제외합니다.
3. 메인 SQL의 ROWNUM은 SQL 유틸에서 자동파싱처리를 해 주어야 합니다.


프로그램에서 작성된 SQL문
SELECT CUST_ID, CUST_FIRST_NAME, CUST_LAST_NAME
FROM    MEM_LIST  CU
WHERE  TRIM(CUST_ID) BETWEEN 2300 AND 500000


프로그램에서 SQL 파싱처리 후 SQL 결과문
SELECT CUST_ID, CUST_FIRST_NAME, CUST_LAST_NAME
FROM    (SELECT ROWNUM NUM, CUST_ID, CUST_FIRST_NAME, CUST_LAST_NAME

              FROM    MEM_LIST  CU
              WHERE  TRIM(CUST_ID) BETWEEN 2300 AND 500000
              AND      ROWNUM <= 10)
WHERE  NUM >= 2

사전사항.

1. Sorting하는데 인덱스 컬럼일 때 프로그래머가 소팅하고자 하는 컬럼의 인덱스 유무를 알고 있어야 하며, 반드시 Sorting할 컬럼에 인덱스가 있어야 합니다.
2. 메인 SQL로직의 ROWNUM NUM과 ROWNUM은 SQL유틸에서 자동파싱해 주어야 합니다.


프로그램에서 작성된 SQL문
SELECT CUST_ID, CUST_FIRST_NAME, CUST_LAST_NAME
FROM    MEM_LIST  CU
WHERE  CUST_ID BETWEEN 2300 AND 500000
ORDER BY CUST_ID


프로그램에서 SQL 파싱처리후 SQL 결과문
SELECT CUST_ID, CUST_FIRST_NAME, CUST_LAST_NAME
FROM    (SELECT ROWNUM NUM, CUST_ID, CUST_FIRST_NAME, CUST_LAST_NAME

              FROM    MEM_LIST  CU
              WHERE  CUST_ID BETWEEN 2300 AND 500000
              AND      ROWNUM <= 10
              ORDER BY CUST_ID)
WHERE   NUM >= 2

사전사항.

소팅하는데 인덱스 컬럼이 없으며, 프로그램 단에서는 메인 SQL만 작성해야 합니다.

 

프로그램에서 작성된 SQL문
SELECT  CUST_ID, CUST_FIRST_NAME, CUST_LAST_NAME
FROM     MEM_LIST  CU
WHERE   TRIM(CUST_ID) BETWEEN 2300 AND 500000
ORDER BY CUST_ID


프로그램에서 SQL 파싱처리후 SQL 결과문
SELECT NUM, CUST_ID, CUST_FIRST_NAME, CUST_LAST_NAME
FROM    (SELECT ROWNUM NUM, CUST_ID, CUST_FIRST_NAME, CUST_LAST_NAME
              FROM    (SELECT CUST_ID, CUST_FIRST_NAME, CUST_LAST_NAME
                            FROM    MEM_LIST  CU
                            WHERE  TRIM(CUST_ID) BETWEEN 2300 AND 500000
                            ORDER BY  CUST_ID)
              WHERE   ROWNUM  <= 10)

WHERE    NUM  >= 2

사전사항.
페이지의 총 건수를 구하고자 할 때는 먼저 주어진 쿼리에서 총 COUNT를 구하는 유틸을 사용 하는데, 유틸 사용 시 ORDER BY Sorting은 반드시 제거해야 합니다. 그리고 조인과 같은 복잡한 쿼리에서는 총 COUNT를 미리 알수 있는 메인 테이블이 있다면, 별도로 총 COUNT를 구하는 SQL을 작성해야 합니다.


프로그램에서 작성된 SQL문
SELECT CUST_ID, CUST_FIRST_NAME, CUST_LAST_NAME
FROM    MEM_LIST  CU
WHERE  TRIM(CUST_ID) BETWEEN 2300 AND 500000
ORDER BY CUST_ID

프로그램에서 SQL 파싱처리후 SQL 결과문(ORDER BY 구문 제외 필수)
SELECT count(*)
FROM    (SELECT CUST_ID, CUST_FIRST_NAME, CUST_LAST_NAME
              FROM    MEM_LIST  CU
              WHERE  TRIM(CUST_ID) BETWEEN 2300 AND 500000)

출처 - http://blog.naver.com/nolbudr.do