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 가 나타나게 됩니다.