> > MS-SQL에는 order by 로 정렬을 한것 가운데
> > 1번째 레코드만 가져올 수 있는 방법이 있는데
> >
> > 오라클에도 이런 방법이 있나요?
> > max를 사용해서 하는 방법 말구요
> > max를 사용하면 max값의 다른 필드값은 가져올 수 가 없잖아요
> > 결국 select 구문을 두번 사용하게 되는데
> >
> > select 구문을 한번만 사용해서 가능한지....
>
> 있지만 효율성이 떨어집니다.
> subquery를 사용하면 됩니다.
> SQL> select ename from emp order by ename desc
> ENAME
> ----------
> hun
> WARD
> TURNER
> SCOTT
> MILLER
> MARTIN
> KING
> ...
>
> SQL> select ename from (select ename from emp order by ename desc)
> 2* where rownum < 2
> SQL> /
>
> ENAME
> ----------
> hun
>
> SQL>
> 단지 SQL문을 한번만 보내면 될 뿐 내부적으로으로는
> max 값을 찾아서 이 max 값을 가지고 다시 쿼리하는 것과
> 어느 것이 효율이 좋은지는 반드시 테스트해 보고
> 사용하세요.
> 몇천건의 소량의 데이타와 수십만건 이상인 테이블에서
> 테스트 해보고 사용하는 것이 좋습니다.
>
> 인덱스 range scan을 할 경우는 실제 그 범위 안에서만 영향을 받게
> 될 것이므로 데이타 건수와도 조금은 영향이 적을 것이라고 생각되지만,
> 테스트 해보시고 ( 보통 천번 이상 loop를 돌리고 평균 값을 내면...)
> 결과를 올려주시는 것이 다른분들에게도 도움이 되지 않을까요?
>
>
오라클에는 힌트라고 하는 문장이 있습니다.
다른 DB에서는 없는것으로 저는 알고 있습니다.
뭐냐 하면 위의 예를 들어 바로 설명하여 드리죠
SELECT /*+ INDEX_DESC(emp emp_ie1) */
ename
FROM emp
WHERE ROWNUM = 1
하시면 건수에 상관없이 인덱스의 뒤에서부터 데이타를 읽어 옵니다.
그림은 넣지 못했습니다.
그런데 4GL 툴들중에서 위의 힌트부분의 문장을 무시하고 처리는 것들이
있더라고요 (파워빌더)
다른 VB, DL 아직 테스트는 못했읍니다.
지금은 자바를 주로 사용하거 든요 ...
힌트문을 정리한 자료가 있으깐 올려드리죠 보시면 조그나마 도움이 되시면
좋겠군요 ...
-- 추신 --
대청출판사 에서나온 오라클 SQL 튜닝 실무사례, 대용량 데이타베이스1,2
를 참고하시면 좀더 많은 자료를 구하실수 있습니다.
|