쿼리 하나 여쭈어봅니다. :) 0 9 1,502

by 예리한 [SQL Query] [2014.12.10 16:43:13]


안녕하세요~ ^^ 쿼리 하나 여쭙고자 합니다.

row에 seq값이 중간중간비어서 순차적으로 들어있을때 
일정 seq값보다 큰것은 전부가져오고 
보다 작은것은 가장 마지막껏 1건만 가져오는걸 쉽게 쿼리하려면 어떻게 하면 될까요?

예를 들면 총 데이터가 아래와 같이 들어있다고 했을때
1
5
6
10
14

8로 조회하는 경우 6, 10, 14이렇게 3건이 결과로 나오면됩니다
조건절에서 8보다 큰값으로 걸면 10, 14는 쉽게 구해지지만 6값을 구하려다보니
어려워지네요.. 지금은 6값은 union으로 따로 구해서 붙혔는데 이게 맞는걸까요?

by 밀크캬라멜 [2014.12.10 16:51:54]

select max(seq)

from table

where seq < '8'

union

select seq

from table

where seq > '8'

음..맞나 모르겠네요 ㅠㅠㅋㅋㅋㅋ


by 아발란체 [2014.12.10 16:56:24]

음.. 저도 밀크캬라멜님 방법에 1표. 가독성도 좋고 성능에도 좋아 보입니다.

 


by 아발란체 [2014.12.10 17:08:23]

SEQ 항목이 인덱스로 잡혀 있다면 UNION 위쪽 질의를 다음과 같이 바꾸면 보다 빠를 것 같습니다.

SELECT /*+ INDEX_DESC(테이블명 인덱스명) */ seq FROM 테이블명 WHERE ROWNUM = 1

... 아 그러고 보니 UNION 이 아니라 UNION ALL로 쓰는 것이 더 빠릅니다.

 


by 마농 [2014.12.10 17:26:01]

1. 굳이 인덱스 힌트 안써도 MAX 자체로도 동일한 성능이 나옵니다.
2. UNION ALL 이 맞습니다.


by jkson [2014.12.11 07:59:08]

마농님 인덱스 안 써도 성능이 동일하단 말씀은 아발란체님이 말씀하신 index_desc나 max나 성능이 동일하다는 말씀이신지요? 저는 index_desc가 항상 빠른 줄 알고 위와 같은 경우 이제껏 index_desc를 썼거든요.


by 마농 [2014.12.11 08:47:01]

인덱스 항목에 MIN 이나 MAX 를 사용하면
인덱스를 이용하여 1건만 읽고 끝내게 됩니다.
INDEX 힌트 + ROWNUM 조건 과 동일하지요.
실행계획상으로는 INDEX FULL SCAN (MIN/MAX)
또는 INDEX RANGE SCAN (MIN/MAX) + FIRST ROW 가 나타나게 됩니다.

http://wiki.gurubee.net/pages/viewpage.action?pageId=27428100


by jkson [2014.12.11 13:35:02]

감사합니다! 하나 또 배웠습니다^^


by 아발란체 [2014.12.12 10:39:17]

마농님 감사합니다. 또 배웁니다.

실행계획에 INDEXL FULL SCAN 뜨는데 COST가 낮아 궁금했던 부분입니다.


by 예리한 [2014.12.12 16:15:55]

밀크캬라멜님 아발란체님 마농님 답변 감사드립니다. ^^

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입