database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 40790 게시물 읽기
No. 40790
페이징 관련 문의입니다.
작성자
이현정
작성일
2015-05-04 19:32
조회수
6,999

11.2.0.3 hp-ux 입니다.

 

 

 

select a.id, b.cd ,c.name from test1 a, test2 b, test3 c

 

where a.pcd= b.pcd

 

and a.pcd=c.pcd(+)

 

and a.name='hong'

 

and b.pid='2345'

 

order by b.cd, a.id, c.name ;

 

 

 

위와같이 3개의 테이블을 조인해서 결과값이 30만건이 나옵니다.

 

한 화면에 다 보이기에는 너무 많은 시간이 걸려서

 

3000건씩 나누어서 페이징을 이용할려고 합니다.

 

 

 

그래서

 

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

 

select * from (

 

select rownum rn, a.id, b.cd ,c.name from test1 a, test2 b, test3 c

 

where a.pcd= b.pcd

 

and a.pcd=c.pcd(+)

 

and a.name='hong'

 

and b.pid='2345'

 

and rownum<=3000

 

order by b.cd, a.id, c.name )

 

where rownum >= 0 ;

 

빠릅니다.

 

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

 

select * from (

 

select rownum rn, a.id, b.cd ,c.name from test1 a, test2 b, test3 c

 

where a.pcd= b.pcd

 

and a.pcd=c.pcd(+)

 

and a.name='hong'

 

and b.pid='2345'

 

and rownum<=240000

 

order by b.cd, a.id, c.name )

 

where rownum >= 210000 ;

 

당연한 결과이지만 다음 페이지로 갈수록 늦어집니다.

 

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

 

 

 

좋은 방법이 있을것 같은데...

 

index + rowid을 이용하는 방법이 있다고 하던데...

 

 

 

index + rowid를 이용할수가 없다면?

 

어떻게 해야 할까요?

 

 

 

 

 

 

이 글에 대한 댓글이 총 3건 있습니다.

1. 사용하신 페이징 방법 자체가 틀렸습니다.
  - Rownum 이 Order By 보다 먼저 적용됩니다.
  - 원하시는 결과를 얻으려면 Order By 먼저 하고 밖에서 Rownum 해야 합니다.


2. 뒤로 갈수록 범위가 넓어져서 늦을수밖에 없습니다.
  - 정렬기준이 인덱스 항목이라면 인덱스를 이용할 수도 있구요.
  - 페이지를 한번에 지정하여 찾아가는 방법 외에
    조회페이지에서 이전, 이후 버튼을 이용하는 방법을 이용해 개선할 수도 있습니다.
  - 조인후 페이징 하는게 아닌 페이징후 조인하는 방법도 있구요.
  - 그런데 위의 경우엔 a, b, c 3개 테이블 항목이 모두 정렬에 이용되어 여러모로 곤란하네요.

마농(manon94)님이 2015-05-06 10:28에 작성한 댓글입니다.
이 댓글은 2015-05-06 10:29에 마지막으로 수정되었습니다.

마농님 감사합니다.

방법이 힘들겠죠...

제가 간단하게 예제를 만들어서 sql을 짜서 그렇네요. ^^;

mysql, db2는 가능한데...오라클도 12c에서는 가능한 방법이 있네요. ^^

 

이현정님이 2015-05-06 11:36에 작성한 댓글입니다.
이 댓글은 2015-05-06 11:38에 마지막으로 수정되었습니다. Edit

가능한 방법이란게 뭔지 궁금하네요...
fetch rows 구문을 이야기 하시는 건가요?
rownum 이 아닌 다른 구문을 이용한다고 해서
내부 프로세스가 달라지는 건 아닙니다.
기본적인 Top N 쿼리 매카니즘은 대동소이 한걸로 압니다.

마농(manon94)님이 2015-05-06 13:45에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
40794100개의 데이터에서 전체평균의 70%의 값을 내는 함수가 있나요? [4]
유도윤
2015-05-09
6999
40792for문과 다이나믹쿼리 into문 조합 문의 [1]
삼만돌이
2015-05-08
7160
40791테이블스페이스 생성 관련 문의
오승환
2015-05-06
6585
40790페이징 관련 문의입니다. [3]
이현정
2015-05-04
6999
40789오라클 클라이언트 설치관련
카일
2015-05-01
6819
40788오라클 디비 export 시 링크 테이블 제외후
이성근
2015-05-01
6737
40787오라클에서 인덱스를 잡는데 잘 안 잡혀요
황남주
2015-04-30
6989
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다