-- 왜 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이 가장 빠름