<< MySQL 의 limit 와 비슷하게 사용한 예 >>

[참고 사이트]
  - ROWNUM에 대하여 (kimho's Oracle )




testboard 에서 5번째 부터 10번째 까지 값을 구하는 방법입니다.  

================= oracle_limit.php3 =============================

$offset = 5;		// 시작 위치
$listnum = 10;		// 선택할 리스트의 개수

$fields = "no, name, title, count";
$query = "select $fields from
            (select rownum as rnum, $fields from testboard)
            where rnum > $offset and rownum <= $listnum
        ";
$stmt = $oci->query($query);

================= oracle_limit.php3 =============================





============================ [참고] =============================
SELECT field1, field2 FROM 
(SELECT field1, field2, rownum as row_no FROM 
(SELECT field1, field2 FROM table1
ORDER BY field1, field2)
WHERE rownum <= 50 )
WHERE row_no >= 11 and row_no <= 20
;
이렇게 사용하시면 대충될 것 같네요.

그러나 큰 테이블을 이렇게 사용하시면
그 시스템이 아무리 성능이 뛰어난 시스템을
사용한다고 하더라도 유저가 많아지고
데이타가 늘어가면 성능이 눈에 뛰게
저하 될 것입니다. full table scan 에 sorting...

이런 경우는 field1, field2 에 인덱스를 만들고
인덱스를 이용해야 합니다.

create index table1_idx on table1
( field1, field2 ) tablespace users
storage ( initial 1M next 1M pctincrease 0 )
;
SELECT /*+ index_desc( table1 table1_idx ) */
field1, field2
FROM table1 
where rownum < 10
;

그리고 당연히 다음번에는 아래와 비슷한
로직을 사용해야 되겠죠?
SELECT /*+ index_desc( table1 table1_idx ) */
field1, field2
FROM table1 
where rownum < 10
and field1 <= ???
and field2 < ???
;

테스트 해 보세요.

-- bravo3 님이 쓰신 글:
>> 1 ~ 10 까지는 제대로 select 됩니다.
>> 
>> SELECT * FROM (SELECT * FROM (SELECT field1, field2 FROM table1 ORDER BY
>> field1, field2) WHERE rownum <= 50 ORDER BY rownum) WHERE rownum >= 1 and
>> rownum <= 10
>> 
>> 그러나, 11 ~ 20 까지 select 하면 'no rows selected' 라고 select 가
>> 안됩니다.
>> 
>> SELECT * FROM (SELECT * FROM (SELECT field1, field2 FROM table1 ORDER BY
>> field1, field2) WHERE rownum <= 50 ORDER BY rownum) WHERE rownum >= 11 and
>> rownum <= 20 

============================ /[참고] =============================



============================ [참고] =============================
오라클로 게시판을 구현할때 가장 애로점이 생기는 부분이 페이징인듯 합니다.

간편하게 하는 방법에는 index_desc 힌트를 사용해서 구현하는 방법도 있습니다.

예를 역정렬인덱스(?)를 사용해서 rownum을 이용한 페이징을 하는 방법인데요 예문을 들어보면 다음과 같습니다.

Primary key는 일괄 시리얼 넘버(ID라고 하죠)라 하고 Primary key의 Constraints Name이 PK_BOARD라고 한다면

select a.id from (select /*+ index_desc(PK_BOARD) */ rownum as rnum, id from board where id>0 order by id desc) a where rnum >= 1 and rownum <=20과 같은 형식의 쿼리문을 쓰면 한페이지에 20개의 글이 뜨게 됩니다.

게시판의 구현방법은 Mysql을 사용해보셨다면 기본적으로 취향에 맞는 방향으로 구현하시면 되구요 Oracle 역시 페이징 이외의 부분에서는 Mysql과 마찬가지라고 생각을 합니다.


============================ /[참고] =============================