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 40266 게시물 읽기
No. 40266
SORT ORDER BY STOPKEY 와 SORT ORDER BY의 결과가 다를수 있나요?
작성자
윤재선(yunjsy2k)
작성일
2013-09-25 20:09ⓒ
2013-09-26 10:22ⓜ
조회수
6,506

아래는 상품데이터를 페이지하는 쿼리입니다.

 

SORT ORDER BY STOPKEY 와 SORT ORDER BY 쿼리의 결과가 서로 상이하여 문의 드립니다.

 

SORT ORDER BY STOPKEY 또한 rownum <= X의 "x" 만큼의 수량을 가지고 row 수만큼 반복하여 소팅을 하는 방법의 하나인데 결과 값이 서로 상이 한경우가 발생합니다. oracle 버그일까요?

 

아니면 혹시 아래 쿼리를 수정해서 해결하는 방법이 있을까요?

 

참고로 order by NORM.UPD_DTTM 컬럼은 인덱스가 없습니다.

 

-- SORT ORDER BY

SELECT y.*

FROM (SELECT ROWNUM AS rnum, x.*

FROM (SELECT PROD.RP_ID,

REP.DPR_ID,

NORM.NP_ID,

PROD.PROD_NM,

FROM XXXXX_PROD PROD

INNER JOIN XXXXX_REP_PROD REP

ON PROD.RP_ID = REP.RP_ID

INNER JOIN XXXXX_NORM_PROD NORM

ON REP.DPR_ID = NORM.DPR_ID

WHERE (PROD.CTS_TP_CD = 'TV'

AND EXISTS (SELECT PDC.GL_ID

FROM XXXXX_CNTRY PDC

WHERE PDC.GL_ID = PROD.SR_ID

AND PDC.CNTRY_CD != 'KR'))

OR (PROD.CTS_TP_CD = 'KZ'

AND EXISTS (SELECT PDG.GL_ID

FROM XXXXX_GENRE PDG

WHERE PDG.GL_ID = PROD.SR_ID

AND PDG.GENRE_CD = '005'))

ORDER BY NORM.UPD_DTTM DESC

) x

) y

WHERE rnum >= 281

AND rnum <= 300

 

 

 

 

 

-- SORT ORDER BY STOPKEY

SELECT y.*

FROM (SELECT ROWNUM AS rnum, x.*

FROM (SELECT PROD.RP_ID,

REP.DPR_ID,

NORM.NP_ID,

PROD.PROD_NM,

FROM XXXXX_PROD PROD

INNER JOIN XXXXX_REP_PROD REP

ON PROD.RP_ID = REP.RP_ID

INNER JOIN XXXXX_NORM_PROD NORM

ON REP.DPR_ID = NORM.DPR_ID

WHERE (PROD.CTS_TP_CD = 'TV'

AND EXISTS (SELECT PDC.GL_ID

FROM XXXXX_CNTRY PDC

WHERE PDC.GL_ID = PROD.SR_ID

AND PDC.CNTRY_CD != 'KR'))

OR (PROD.CTS_TP_CD = 'KZ'

AND EXISTS (SELECT PDG.GL_ID

FROM XXXXX_GENRE PDG

WHERE PDG.GL_ID = PROD.SR_ID

AND PDG.GENRE_CD = '005'))

ORDER BY NORM.UPD_DTTM DESC

) x

WHERE ROWNUM <= 300 /**P*/

) y

WHERE rnum >= 281

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

두개 쿼리의 조건이 서로 다르네요.???
 - 1번 쿼리 : PDC.PRODUCTION_CNTRY_CD != 'KR'
 - 2번 쿼리 : PDC.CNTRY_CD != 'KR'

마농(manon94)님이 2013-09-26 08:41에 작성한 댓글입니다.

마농님.. CNTRY_CD은 .. 쿼리상에 오류가 아니라. 컬럼명을 변경한건인데 하나는 수정하지 않은 것입니다...

 

윤재선(yunjsy2k)님이 2013-09-26 10:23에 작성한 댓글입니다.
이 댓글은 2013-09-26 10:24에 마지막으로 수정되었습니다.

페이징에서 ROWNUM을 이용하여 STOPKEY 방식으로 데이터를 제한 하려면

ORDER BY 절이 유니크해야 합니다.

아마도 NORM.UPD_DTTM 컬럼값이 유니하지 않은 것 같은데요.

 

윗 문장은 전체를 ORDER BY 한 후에 ROWNUM을 부여하고 데이터를 제한하기에

페이지가 바뀌어도 항상 원하는 데이터를 얻을 수 있습니다.

하지만, 전체 데이터를 ORDER BY 해야 하기에 성능상 불리합니다.

 

반면 아래 문장은 ORDER BY 절이 유니크하지 않는한, 원하는 결과를 보장해주지 않습니다.

즉 페이지를 바꾸어 갈 때 앞페이지에서 나왔던 데이터가 다시 나올 수도 있는 거죠..

메모리 상에 상위 300건만 보관하면 되므로 성능상 유리합니다.

성능상 유리하지만 부정확한 페이징 방식입니다.

 

따라서, 페이징을 정확하고 신속하게 만들려면 

아래 문장처럼 구현하면서, ORDER BY 절을 유니크하게 구성해주는 것입니다.

m님이 2013-09-26 14:05에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
40269case 구문을 만들려구하는데요. [1]
DB란?
2013-09-26
6241
40268쿼리로그 남기기 sql로그 [1]
전성진
2013-09-25
6438
40267최근 한건 조회 쿼리에서 order by 정려에서 막혔습니다. [1]
쌈창
2013-09-25
6107
40266SORT ORDER BY STOPKEY 와 SORT ORDER BY의 결과가 다를수 있나요? [3]
윤재선
2013-09-25
6506
40264로깅 관련 트리거 사용 질문입니다.
게스트
2013-09-25
5813
40263row를 가변으로 만들기? [1]
이기자
2013-09-23
6246
40262각기 다른 테이블을 한 번에 열람하기 [2]
지우
2013-09-22
5701
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.020초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다