개인적인 질문입니다. 게시판을 만들고있는데 정렬이 이상하게 됩니다. 0 4 1,444

by 이진우 [2011.04.19 15:50:27]



게시판 쿼리를 미리 돌려 보고있는데 정렬이 이상하게 되네요

우선은 최신글이 위로 올라와야 하기때문에 쿼리를 이렇게 했는데 정렬이 이상하게 되는 이유는 뭘까요

SELECT
   ROWNUM RNUM,
   n.N_SEQ AS n_seq, n.SUBJECT AS subject,
   n.WRITER, n.PASS, n.REG_DATE AS reg_date, 
   n.N_RE_SEQ, n.N_RE_LEV, n.N_RE_REF,
   n.N_IP, nvl(f.N_FILENM, 'nofile') AS n_fileNm, nvl(f.attach_seq, 0) AS attach_seq FROM  
  (SELECT ROWNUM RNUM, N_SEQ, SUBJECT, WRITER, PASS,  
  REG_DATE,  N_RE_SEQ,   
  N_RE_LEV, N_RE_REF, N_IP FROM
 (SELECT * FROM NOTICE ORDER BY  
    REG_DATE DESC, N_RE_REF DESC, N_RE_LEV ASC)
)n
 left outer JOIN  
    TB_ATTACH f  ON n.N_SEQ = f.ATTACH_SEQ 
    WHERE RNUM >=? AND RNUM <=?
이렇게 해주는데요 쿼리가

1  5  5T4T2G  admin G45  11/04/15 0 0 0 127.0.0.1/ msgr10kr.exe 5
2  9  456745  admin 674567  11/04/19 0 0 0 127.0.0.1/ 신입...pptx 9
3  2  234  admin 34v253v  11/04/15 0 0 0  msgr10kr.exe 2
4  7  ㅈㄷㄳㅈㄷ admin ㄱㅅㅈㄷㄱ 11/04/18 0 0 0 127.0.0.1/ _발명진흥회().pptx 7
5  8  4325  admin 2345  11/04/18 0 0 0 127.0.0.1/ 기술문서.pptx 8
6  6  ㅈㄷㄳㅈㄷ admin ㄱㅅㅈㄷㄱ 11/04/18 0 0 0 127.0.0.1/ _발명진흥회().pptx 6
7  1  b234t2b3  admin 4b2b34tb   11/04/15 0 0 0  nofile 0
8  11  444  admin 444  11/04/19 0 0 0 127.0.0.1/ nofile 0
9  0  5v34  admin v345vvv  11/04/15 0 0 0  nofile 0
10  4  3456nh  admin 6h356h  11/04/15 0 0 0 127.0.0.1/ nofile 0

서브 쿼리로 미리 정렬을 해주고 하는데 왜그럴까요 도와주세요
by 전창환 [2011.04.19 16:25:14]
플랜을 볼수 없어서 확실치는 않지만 아웃터조인이라 TB_ATTACH <-- 이 테이블로 먼저 드라이빙 될꺼 같습니다. 하여 NOTICE테이블의 정렬은 흐트러질꺼 같네요.
굳이 저 안에다 order by하실 이유라도 있으신가요..? 제일 바깥쪽에 정렬을 하시지요..?

by 이진우 [2011.04.19 17:45:30]
아 그런가요? from 서브 쿼리는 그안에 것이 먼저 실행되는 걸로 알고있어서 그랬는데 한번 해보겠습니다.

by 전창환 [2011.04.19 21:06:39]
플랜을 확인하시면 어느 테이블이 먼저 드라이빙되었는지 아실수 있습니다
추가로 몇가지 적으면
1. 젤처음 정렬을 하시면 이후 조인등의 작업으로 소팅이 깨질 가능성이 발생합니다
2. 예로, 100만건 읽어서 지지고 볶고해서 최종 10건을 추출하였습니다 정렬을 100만건에서 하는게 좋을까요? 최종 10건에서 하는게 좋을까요?
3. 무조건 서브쿼리 정확히 인라인뷰라고 해서 먼저 드라이빙 되지는 않습니다 옵티마이져는 결과에 지장이 없다면 해당 서브쿼리를 없애버리고 합쳐버리기도 합니다

by 마농 [2011.04.20 08:33:04]
1. 정렬이 안되는 이유
정렬 후 조인할때 정렬된 집합이 드라이빙되면서 Nested Loop로 풀려야만 정렬이 유지됩니다.
드라이빙 테이블이 바뀐다던가? NL 이 아닌 Hash로 풀린다거나 한다면 정렬은 흐트러질 수 있습니다.

SELECT /*+ ORDERED USE_NL(n, f) */ -- 이 구문은 FROM절 순서대로 NL 조인을 하라는 힌트입니다.
n.*
, NVL(f.n_filenm, 'nofile') AS n_fileNm
, NVL(f.attach_seq, 0) AS attach_seq
FROM
(
SELECT ROWNUM rnum
, n_seq, subject, writer, pass, reg_date, n_re_seq, n_re_lev, n_re_ref, n_ip
FROM
(
SELECT -- * 보다는 필요 컬럼만 정렬하셔야 정렬비용이 줄어듭니다.
n_seq, subject, writer, pass, reg_date, n_re_seq, n_re_lev, n_re_ref, n_ip
FROM notice
ORDER BY reg_date DESC, n_re_ref DESC, n_re_lev ASC
)
WHERE RWONUM <= :Page * 10 -- 이구문이 있어야 정렬비용이 줄어듭니다.
) n
LEFT OUTER JOIN tb_attach f
ON n.n_seq = f.attach_seq
WHERE rnum BETWEEN (:Page-1) * 10 + 1 AND :Page * 10
;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입