-- 왜 TFS(TABLE FULL SCAN) / INDEX (FULL/RANGE) SCAN 인가
-- 왜 INDEX FULL SCAN / INDEX RANGE SCAN인가
-- 왜 INDEX 로 (PK / X01) 이 선택됐는가
-- 왜 SORT가 발생해서 전체범위처리가 됐는가
-- 왜 옵티마이저모드를 변경한 것만으로도 index힌트를 사용한 실행계획과 동일한 실행계획을 갖는가
-- 왜 owner='SYS' 와 owner='APPQOSSYS'가 다른 실행결과를 갖는가
id NUMBER GENERATED ALWAYS as IDENTITY(START with 1 INCREMENT by 1),
owner varchar2(255) not null,
object_name varchar2(255) ,
created DATE not null
create index x01 on BIG_TABLE(owner, created);
pk : id
------------------------------------------------------------------------------------------------------------------------------
A-0 select /*+ 힌트없음 */ * from big_table X order by owner; -- Table Full Scan [전체범위처리] 5.69s
=> 인덱스를 태웟을때의 비용이 너무 많이 때문
A-0-1 select /*+ index(X) */ * from big_table X order by owner; -- index full scan of pk(id) [전체범위처리] 132.53s
=> 강제로 index를 태울경우 where절에 아무 조건이 없기 때문에 pk를 탐
A-0-2 select /*+ FIRST_ROWS */ * from big_table X order by owner; -- index full scan of x01 [부분범위처리] 0.96s
=> 최초 응답속도로 봤을때 x01을 타는게 가장 빠름
------------------------------------------------------------------------------------------------------------------------------
A-1. select /*+ 힌트없음 */ * from big_table X order by created; --Table Full Scan [전체범위처리]
=> 인덱스를 타는것보다 풀스캔 후 정렬이 더 빠름
A-1-1 select /*+ index(X) */ * from big_table X order by created; --Index Full Scan of pk [전체범위처리]
=> 확인필요
A-1-2 select /*+ FIRST_ROWS */ * from big_table X order by created; --Table Full Scan [전체범위처리]
=> 인덱스에 Created가 선두컬럼이 아니기 때문에 풀스캔이 빠르다고 판단
------------------------------------------------------------------------------------------------------------------------------
A-2. select /*+ 힌트없음 */ * from big_table X where owner='SYS' order by created; --Table Full Scan [전체범위처리]
=> SYS에 해당하는 데이터가 매우 많기 때문에 인덱스를 타는 것보다 풀스캔이 빠름
A-2-1.select /*+ index(X) */ * from big_table X where owner='SYS' order by created; --Index Full Scan of pk [전체범위처리]
=> 확인필요
A-2-2.select /*+ FIRST_ROWS */ * from big_table X where owner='SYS' order by created; --Index RangeScan of x01 [부분범위처리]
=> 최초 응답속도로 봤을때 x01을 타는게 가장 빠름
------------------------------------------------------------------------------------------------------------------------------
A-3. select /*+ 힌트없음 */ * from big_table X where owner='APPQOSSYS' order by created; --Index RangeScan of x01 [부분범위처리]
=> APPQOSSYS는 데이터가 적고 where절에 명시되어 있기 때문에 인덱스를 탐
A-3-1.select /*+ index(X) */ * from big_table X where owner='APPQOSSYS' order by created; --Index RangeScan of x01 [부분범위처리]
=> APPQOSSYS는 데이터가 적고 where절에 명시되어 있기 때문에 인덱스를 탐
A-3-2.select /*+ FIRST_ROWS */ * from big_table X where owner='APPQOSSYS' order by created; --Index RangeScan of x01 [부분범위처리]
=> APPQOSSYS는 데이터가 적고 where절에 명시되어 있기 때문에 인덱스를 탐
------------------------------------------------------------------------------------------------------------------------------
B-1. select /*+ 힌트없음 */ * from big_table X order by id; -- Index Full Scan of pk [부분범위처리]
=> id 값이 변별력이 아주 좋기 때문
B-1-1.select /*+ index(X) */ * from big_table X order by id; -- Index Full Scan of pk [부분범위처리]
=> id 값이 변별력이 아주 좋기 때문
B-1-2.select /*+ FIRST_ROWS */ * from big_table X order by id; -- Index Full Scan of pk [부분범위처리]
=> 최초 응답속도로 봤을때 pk을 타는게 가장 빠름
B-1-3.select /*+ index(X x01) */ * from big_table X order by id; -- Index Full Scan of pk [전체범위처리]
=> x01에 id 값이 없음
------------------------------------------------------------------------------------------------------------------------------
■ 문제 잘못 됨
B-2. select /*+ 힌트없음 */ * from big_table X where owner = 'SYS' order by id; -- Index Full Scan of pk [부분범위처리]
=> index 타지 않고 TABLE ACCESS FULL
B-2-1.select /*+ index(X x01) */ * from big_table X where owner = 'SYS' order by id; -- Index Full Scan of pk [부분범위처리]
=> sys 데이터가 많기 때문에 정렬하고 필터하는게 나음
B-2-2.select /*+ FIRST_ROWS */ * from big_table X where owner = 'SYS' order by id; -- Index Full Scan of pk [부분범위처리]
=> 특정 갯수의 데이터만 먼저 확인하면 됨
------------------------------------------------------------------------------------------------------------------------------
(23.02.24추가) -- 성능고도화2권 p.368
A-4. select /*+ 힌트없음 */ * from big_table X order by owner, created; --Table Full Scan [전체범위처리]
=> select절에 *이면 인덱스 leaf 블록에서 찾아서 테이블 블록에 access 할는데 full scan이 빠르다고 판단한 듯
A-4-1.select /*+ FIRST_ROWS */ * from big_table X order by owner, created; -- Index Full Scan of x01 [부분범위처리]
=> x01이 가장 빠름