- 왜 TFS(TABLE FULL SCAN) / INDEX (FULL/RANGE) SCAN 인가
- A-0-2 와 A-1-2 가 다른 이유
- A-1-2의 경우 order by절에 인덱스 후행 컬럼이 명시되어, 부분 범위 처리를 할 수 없어 Table Full Scan
- 근데 왜
select /*+ FIRST_ROWS */ * from big_table X ; 는 Table full scan이지?
- 부분범위처리 힌트만 줘서?
select /*+ index(X x01) FIRST_ROWS */ * from big_table X ; 하니까 INDEX FULL SCAN 탐
- 왜 INDEX FULL SCAN / INDEX RANGE SCAN인가
-
왜 INDEX 로 (PK / X01) 이 선택됐는가
- 왜 SORT가 발생해서 전체범위처리가 됐는가
- A-1-2 의 경우 전체범위처리로 변경됨
- order by 로 sort가 발생하면 부분 범위 처리 불가
- 참고
-
왜 옵티마이저모드를 변경한 것만으로도 index힌트를 사용한 실행계획과 동일한 실행계획을 갖는가
- 왜 owner='SYS' 와 owner='APPQOSSYS'가 다른 실행결과를 갖는가
- A-2 와 A-3 의 차이
- APPQOSSYS는 인덱스 선두 컬럼인 owner의 첫 번째 NDV 이기도 하고, ROW 수 비중이 매우 적어(864/10000000 ) RANGE SCAN을 해야 비용이 가장 적음
- SYS 값이 들어가 있는 인덱스 블록이 많아 index range scan보다 index full scan이 더 효율적
- 궁금한 점
- /*+ index(TABLE_NAME) */ 힌트를 사용하면 index_desc 힌트를 안써도 필요 시 옵티마이저가 스스로 내림차순 정렬 후 scan을 하는지?
- A-4 FIRST_ROWS 외엔 “OPTIMIZER=ALL_ROWS” 인데 부분범위처리인건 어떻게 파악하는지?
- B-2
- owner = ‘SYS’가 전체 테이블의 80%이기도 하고, 정렬연산을 생략시켜주는 pk 를 선택