[order by와 인덱스 그리고 힌트에 대한 간단한 실습 예문]
** myemp1 테이블의 ename 칼럼에 오름차순 인덱스가 있을 때
(인덱스 이름은 idx_myemp1_ename)
** 아래에서 where ename <= '흥' 조건은 ename칼럼을 where절에 출현시키기 위하여
** 사용한 조건으로 무조건 참인 조건을 준 것이다.
** 이름이 '흥'보다 작은 값들로 되어 있다
-- where절에 ename이 출현하고 ename만 select 될 때는 인덱스영역에서 스캔하므로
-- 빠르게 출력되고 이름 오름차순으로 나온다.
select ename from myemp1 where ename <= '흥'
-- 인덱스 구성칼럼이 아닌 SAL 칼럼때문에...오라클 옵티마이저는 원본 테이블에서
-- FULL TABLE SCAN 한다. 입력된 순서대로 출력된다, 데이터가 정렬되지 않는다.
select ename,sal from myemp1 where ename <= '흥'
-- 아래는 order by절을 사용했지만 select 되는 칼럼이 ename 밖에없고
-- where절에 ename 칼럼이 출현하므로 인덱스에서 스캐닝하여 빠르게 출력된다.
-- 이름내림차순 (홍길동 -> 김길동 순으로) 출력
select ename from myemp1 where ename <= '흥' order by ename desc
----------------------------------------------------------------------------------------------------
-- 아래 쿼리를 이름 오름 차순으로 출력되도록 하려면...(반드시 힌트를 써야한다.)
----------------------------------------------------------------------------------------------------
select ename,sal from myemp1 where ename <= '흥'
==>
-- select 리스트에 sal 칼럼이 출현하여 인덱스 영역에서 스캐닝하지 않으므로 느리다.
-- 원본 테이블의 데이터를 FULL SCAN하여 소트한다.
select ename,sal from myemp1 where ename <= '흥' order by ename
-- 힌트를 사용하면 인덱스 영역에서 인덱스가 생성된 순서대로(순방향으로) 스캐닝하므로
-- ename 오름차순으로 출력된다.
select /*+ index(myemp1 idx_myemp1_ename) */ ename,sal from myemp1
where ename <= '흥' (바로나옴)
-- 위 index 힌트와 같다.
select /*+ index_asc(myemp1 idx_myemp1_ename) */ ename,sal from myemp1
where ename <= '흥' (바로나옴)
----------------------------------------------------------------------------------------------------
-- 아래 쿼리를 이름 내름 차순으로 출력되도록 하려면...(반드시 힌트를 써야한다.)
----------------------------------------------------------------------------------------------------
select ename,sal from myemp1 where ename <= '흥'
==>
-- select 리스트에 sal 칼럼이 출현하여 인덱스 영역에서 스캐닝하지 않으므로 느리다.
-- 원본 테이블의 데이터를 FULL SCAN하여 소트한다.
select ename,sal from myemp1 where ename <= '흥' order by ename desc
-- 힌트를 사용하면 인덱스 영역에서 인덱스가 생성된 반대대로(역방향으로) 스캐닝하므로
-- ename 내림차순으로 출력된다.
select /*+ index_desc(myemp1 idx_myemp1_ename) */ ename,sal from myemp1
where ename <= '흥' (바로나옴)
** myemp1 테이블의 ename 칼럼에 오름차순 인덱스가 있을 때
(인덱스 이름은 idx_myemp1_ename)
** 아래에서 where ename <= '흥' 조건은 ename칼럼을 where절에 출현시키기 위하여
** 사용한 조건으로 무조건 참인 조건을 준 것이다.
** 이름이 '흥'보다 작은 값들로 되어 있다
-- where절에 ename이 출현하고 ename만 select 될 때는 인덱스영역에서 스캔하므로
-- 빠르게 출력되고 이름 오름차순으로 나온다.
select ename from myemp1 where ename <= '흥'
-- 인덱스 구성칼럼이 아닌 SAL 칼럼때문에...오라클 옵티마이저는 원본 테이블에서
-- FULL TABLE SCAN 한다. 입력된 순서대로 출력된다, 데이터가 정렬되지 않는다.
select ename,sal from myemp1 where ename <= '흥'
-- 아래는 order by절을 사용했지만 select 되는 칼럼이 ename 밖에없고
-- where절에 ename 칼럼이 출현하므로 인덱스에서 스캐닝하여 빠르게 출력된다.
-- 이름내림차순 (홍길동 -> 김길동 순으로) 출력
select ename from myemp1 where ename <= '흥' order by ename desc
----------------------------------------------------------------------------------------------------
-- 아래 쿼리를 이름 오름 차순으로 출력되도록 하려면...(반드시 힌트를 써야한다.)
----------------------------------------------------------------------------------------------------
select ename,sal from myemp1 where ename <= '흥'
==>
-- select 리스트에 sal 칼럼이 출현하여 인덱스 영역에서 스캐닝하지 않으므로 느리다.
-- 원본 테이블의 데이터를 FULL SCAN하여 소트한다.
select ename,sal from myemp1 where ename <= '흥' order by ename
-- 힌트를 사용하면 인덱스 영역에서 인덱스가 생성된 순서대로(순방향으로) 스캐닝하므로
-- ename 오름차순으로 출력된다.
select /*+ index(myemp1 idx_myemp1_ename) */ ename,sal from myemp1
where ename <= '흥' (바로나옴)
-- 위 index 힌트와 같다.
select /*+ index_asc(myemp1 idx_myemp1_ename) */ ename,sal from myemp1
where ename <= '흥' (바로나옴)
----------------------------------------------------------------------------------------------------
-- 아래 쿼리를 이름 내름 차순으로 출력되도록 하려면...(반드시 힌트를 써야한다.)
----------------------------------------------------------------------------------------------------
select ename,sal from myemp1 where ename <= '흥'
==>
-- select 리스트에 sal 칼럼이 출현하여 인덱스 영역에서 스캐닝하지 않으므로 느리다.
-- 원본 테이블의 데이터를 FULL SCAN하여 소트한다.
select ename,sal from myemp1 where ename <= '흥' order by ename desc
-- 힌트를 사용하면 인덱스 영역에서 인덱스가 생성된 반대대로(역방향으로) 스캐닝하므로
-- ename 내림차순으로 출력된다.
select /*+ index_desc(myemp1 idx_myemp1_ename) */ ename,sal from myemp1
where ename <= '흥' (바로나옴)
댓글 없음:
댓글 쓰기