오라클SQL게시판 페이지 나누기쿼리,order by를 사용 하지않고 ORACLE힌트사용
아래 게시판 쿼리를 참조하고,,, 기존 order by를 사용하는 경우와 비교해 보기 바랍니다.
만약 데이터가 2000만건인데 order by를 사용하여 쿼리한다면 엄청난 시간을 기다려야 결과가 나오지만 아래처럼 힌트를 이용하여 작성한다면 즉시 결과를 확인할 수가 있을 것 입니다.
---------------------------------------------------------------------------------------
myemp1 테이블을 게시판이라 가정하고, 한페이지당 10개씩 이름기준으로 역순으로 가지고 오는
페이지 쿼리를 작성하려 한다. 10000번째 페이지를 가지고 오는 쿼리를 작성하시오.
(ename인덱스 idx_myemp1_ename를 이용)
selcct 리스트는 empno, ename, sal, deptno
---------------------------------------------------------------------------------------
1. 먼저 ename 컬럼으로 인덱스 생성
create index idx_myemp1_ename on myemp1(ename)
2. 쿼리작성
추천하는 방법이다.
select empno, ename, sal, deptno
from
(
select /*+ index_desc(myemp1 idx_myemp1_ename) */
rownum rnum,
empno,
ename ,
sal,
deptno
from myemp1 e
where ename is not null
and rownum <= 10*10000
)
where rnum > 10*9999+1
데이터 로드 금방 된다.
아래 쿼리와 비교해 보세요
select empno, ename, sal, deptno
from
(
select
rownum rnum,
empno,
ename ,
sal,
deptno
from myemp1 e
where ename is not null
and rownum <= 10*10000
order by ename desc
)
where rnum > 10*9999+1
위 쿼리는 안쪽 인라인뷰에서 먼저 전체데이터를 select한후 rownum<=10*10000 만족하는 데이터 추출 후 sal 순으로 역순 정렬하므로 원하는 않는 결과값이 출력된다. 아래 내용을 참고하자.
****************************************************************************
아래의 rownum과 order by 사용예제를 이해 하도록 하자.
EMP테이블에서 급여 상위 5명을 추출하고자 할때
1. 아래 쿼리는 where절을 만족하는 데이터에 rownum을 1,2,3 붙이고
그런다음 sal순으로 소트하므로 rownum이 섞인다.
select rownum, empno,ename, sal
from emp
where rownum <= 5
order by sal desc
4 7566 JONES 2975
2 7499 ALLEN 1600
5 7654 MARTIN 1250
3 7521 WARD 1250
1 7369 SMITH 800
2. 원하는 결과값을 가지고 온다.
아래는 인라인뷰에서 먼저 sal순으로 정렬하여 바깥쪽 select에 전달하므로
바깥쪽 select의 where절에서 rownum<=5 로 비교가능하며, 정렬순서역시 예쁘게 rownum 순으로 나오게 된다.
select rownum, empno,ename, sal
from (
select empno,ename, sal
from emp
order by sal desc
)
where rownum <= 5
1 7839 KING 5000
2 7788 SCOTT 3000
3 7902 FORD 3000
4 7566 JONES 2975
5 7698 BLAKE 2850
아래 게시판 쿼리를 참조하고,,, 기존 order by를 사용하는 경우와 비교해 보기 바랍니다.
만약 데이터가 2000만건인데 order by를 사용하여 쿼리한다면 엄청난 시간을 기다려야 결과가 나오지만 아래처럼 힌트를 이용하여 작성한다면 즉시 결과를 확인할 수가 있을 것 입니다.
---------------------------------------------------------------------------------------
myemp1 테이블을 게시판이라 가정하고, 한페이지당 10개씩 이름기준으로 역순으로 가지고 오는
페이지 쿼리를 작성하려 한다. 10000번째 페이지를 가지고 오는 쿼리를 작성하시오.
(ename인덱스 idx_myemp1_ename를 이용)
selcct 리스트는 empno, ename, sal, deptno
---------------------------------------------------------------------------------------
1. 먼저 ename 컬럼으로 인덱스 생성
create index idx_myemp1_ename on myemp1(ename)
2. 쿼리작성
추천하는 방법이다.
select empno, ename, sal, deptno
from
(
select /*+ index_desc(myemp1 idx_myemp1_ename) */
rownum rnum,
empno,
ename ,
sal,
deptno
from myemp1 e
where ename is not null
and rownum <= 10*10000
)
where rnum > 10*9999+1
데이터 로드 금방 된다.
아래 쿼리와 비교해 보세요
select empno, ename, sal, deptno
from
(
select
rownum rnum,
empno,
ename ,
sal,
deptno
from myemp1 e
where ename is not null
and rownum <= 10*10000
order by ename desc
)
where rnum > 10*9999+1
위 쿼리는 안쪽 인라인뷰에서 먼저 전체데이터를 select한후 rownum<=10*10000 만족하는 데이터 추출 후 sal 순으로 역순 정렬하므로 원하는 않는 결과값이 출력된다. 아래 내용을 참고하자.
****************************************************************************
아래의 rownum과 order by 사용예제를 이해 하도록 하자.
EMP테이블에서 급여 상위 5명을 추출하고자 할때
1. 아래 쿼리는 where절을 만족하는 데이터에 rownum을 1,2,3 붙이고
그런다음 sal순으로 소트하므로 rownum이 섞인다.
select rownum, empno,ename, sal
from emp
where rownum <= 5
order by sal desc
4 7566 JONES 2975
2 7499 ALLEN 1600
5 7654 MARTIN 1250
3 7521 WARD 1250
1 7369 SMITH 800
2. 원하는 결과값을 가지고 온다.
아래는 인라인뷰에서 먼저 sal순으로 정렬하여 바깥쪽 select에 전달하므로
바깥쪽 select의 where절에서 rownum<=5 로 비교가능하며, 정렬순서역시 예쁘게 rownum 순으로 나오게 된다.
select rownum, empno,ename, sal
from (
select empno,ename, sal
from emp
order by sal desc
)
where rownum <= 5
1 7839 KING 5000
2 7788 SCOTT 3000
3 7902 FORD 3000
4 7566 JONES 2975
5 7698 BLAKE 2850
오라클자바커뮤니티교육센터, 개발자전문교육, 개인80%환급
www.oraclejavacommunity.com
평일주간(9:30~18:10) 개강
(6/30)[기업100%환급]PL/SQL,ORACLE HINT,TUNING
(6/30)[기업100%환급]안드로이드개발자과정
(7/07)[기업100%환급]C#4.0,WinForm,ADO.NET프로그래밍
(7/07)[기업100%환급]Spring ,MyBatis,Hibernate실무과정
(7/07)[기업100%환급]자바기초에서 JDBC, Servlet/JSP까지
(7/07)[채용예정교육]오라클자바개발잘하는신입뽑기프로젝트,교육전취업확정
(7/14)[기업100%환급]SQL기초에서 Schema Object까지
평일야간(19:00~21:50) 개강
(7/01)안드로이드개발자과정
(7/01)닷넷(C#,Network,ADO.NET,ASP.NET)마스터과정
(7/02)Spring3.X, MyBatis, Hibernate실무과정
(7/02)자바웹(JSP,Spring,MyBatis,XPlatform)프로젝트과정
(7/02)JAVA,Network&WEB&Framework(자바기초에서웹스프링까지)
(7/03)웹퍼블리싱 마스터
(7/15)SQL기초에서실무까지
(7/15)MyBatis3.X, Hibernate4.X ORM실무과정
(7/22)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지
주말(10:00~17:50) 개강
(7/05)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지
(7/05)SQL초보에서 Schema Object까지
(7/12)자바웹(JSP,Spring,MyBatis,XPlatform)프로젝트과정
(7/12)MyBatis3.X, Hibernate4.X ORM실무과정
(7/12)개발자를위한PLSQL,SQL튜닝,힌트
(7/13)C#,ASP.NET마스터
(7/19)Spring3.X, MyBatis, Hibernate실무과정
(7/19)웹퍼블리싱 마스터
(7/19)안드로이드개발자과정
주말저녁(18:30~22:20) 개강
(7/19)JAVA,Network&WEB&Framework
(8/09)SQL기초에서실무까지
www.oraclejavacommunity.com
평일주간(9:30~18:10) 개강
(6/30)[기업100%환급]PL/SQL,ORACLE HINT,TUNING
(6/30)[기업100%환급]안드로이드개발자과정
(7/07)[기업100%환급]C#4.0,WinForm,ADO.NET프로그래밍
(7/07)[기업100%환급]Spring ,MyBatis,Hibernate실무과정
(7/07)[기업100%환급]자바기초에서 JDBC, Servlet/JSP까지
(7/07)[채용예정교육]오라클자바개발잘하는신입뽑기프로젝트,교육전취업확정
(7/14)[기업100%환급]SQL기초에서 Schema Object까지
평일야간(19:00~21:50) 개강
(7/01)안드로이드개발자과정
(7/01)닷넷(C#,Network,ADO.NET,ASP.NET)마스터과정
(7/02)Spring3.X, MyBatis, Hibernate실무과정
(7/02)자바웹(JSP,Spring,MyBatis,XPlatform)프로젝트과정
(7/02)JAVA,Network&WEB&Framework(자바기초에서웹스프링까지)
(7/03)웹퍼블리싱 마스터
(7/15)SQL기초에서실무까지
(7/15)MyBatis3.X, Hibernate4.X ORM실무과정
(7/22)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지
주말(10:00~17:50) 개강
(7/05)자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지
(7/05)SQL초보에서 Schema Object까지
(7/12)자바웹(JSP,Spring,MyBatis,XPlatform)프로젝트과정
(7/12)MyBatis3.X, Hibernate4.X ORM실무과정
(7/12)개발자를위한PLSQL,SQL튜닝,힌트
(7/13)C#,ASP.NET마스터
(7/19)Spring3.X, MyBatis, Hibernate실무과정
(7/19)웹퍼블리싱 마스터
(7/19)안드로이드개발자과정
주말저녁(18:30~22:20) 개강
(7/19)JAVA,Network&WEB&Framework
(8/09)SQL기초에서실무까지
댓글 없음:
댓글 쓰기