[Oracle] INDEX FULL SCAN

당당·2023년 12월 26일
0

Oracle

목록 보기
33/51

📔설명

INDEX FULL SCAN을 알고, table full scan과 차이를 알아보자


🍔INDEX 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

profile
MySQL DBA 신입

0개의 댓글