INDEX FULL SCAN을 알고, table full scan과 차이를 알아보자
table full scan
: 테이블 처음부터 끝까지 다 스캔하면서 원하는 데이터를 찾는 방법
select /*+ gather_plan_statistics */ ename, sal
from emp
where sal=3000;
select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));
위의 방법은 오래걸리기 때문에, 인덱스를 이용하게 된다.
-- 인덱스가 (sal, ename)으로 구성된 경우
select /*+ gather_plan_statistics index_fs(emp emp_sal_ename) */ ename, sal
from emp
where ename='JONES';
select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));
--인덱스의 첫번째 컬럼이 where절에 있어줘야 하는데,
--두번째 컬럼이 where절에 존재하기 때문에 인덱스를 사용할 수 없게 되는데
--그럼에도 불구하고 사용하고 싶을 경우 index full scan 사용
index full scan
: 결합 컬럼 인덱스의 첫번째 컬럼이 아닌 컬럼의 데이터를 검색시 인덱스 전체를 스캔하며 원하는 데이터 검색
: 인덱스를 통해 테이블 엑세스 (ex. emp_sal 인덱스)
INDEX RANGE SCAN
create index emp_sal on emp(sal);
select /*+ gather_plan_statistics */ ename, sal
from emp
where sal=3000;
select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));
(ex. sal, ename을 묶어서 인덱스 구성)
drop index emp_sal;
create index emp_sal_ename on emp(sal, ename);
: 검색하길 원하는 데이터가 인덱스에 다 있다면 테이블 액세스 X
select /*+ gather_plan_statistics */ ename, sal
from emp
where sal=3000;
select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));
--sal, ename으로 인덱스를 구성했으니 인덱스 자체에서 ename, sal을 구할 수 있으므로 테이블 액세스 필요X