문서의 이전 판입니다!
① ROWID로 1로우 액세스 ② 클러스터 조인에 의한 1로우 액세스 ③ Unigue HASH Cluster에 의한 1로우 액세스 ④ Unique INDEX에 의한 1로우 액세스 ⑤ CLUSTER 조인 ⑥ Non Unique Hash Cluster Key ⑦ Non Unique Cluster Key ⑧ Non Unique 결합 인덱스 ⑨ Non Unique 한 컬럼 인덱스 ⑩ 인덱스에 의한 범위처리 ⑪ 인덱스에 의한 전체범위 처리 ⑫ Sort Merge 조인 ⑬ 인덱스 컬럼의 MIN, MAX처리 ⑭ 인덱스 컬럼의 ORDER BY ⑮ 전체 테이블 스캔
EX> 1,000,000 로우를 가지는 TAB1테이블과 100로우를 가지는 TAB2테이블의
로우수를 알지 못하기 때문에 어느쪽이 전체 테이블 스캔 하는것이 유리한지 구별할 수 없다.
EX> 2종류의 값만 가지고 있어 평균분포도가 50%인 컬럼 A로 구성된 인덱스와 10,000종류를
가지고 있어 0.01%의 평균 분포도를 가진 컬럼 B로 구성된 인덱스가 존재. A='10' AND B LIKE '123%'을
주었을때 무조건 ‘=’로 사용한 컬럼A를 사용하는 것이 더 유리하다고 판단.
⇒통계정보는 테이블의 로우 수와 블록 수, 블록당 평균 로우수, 로우의 평균길이, 컬럼별 상수값의 종류, 분포도, 컬럼 내 NULL값의 수, 클러스터링 팩터, 인덱스의 길이, 최대 최소값, 리프 블록수, 가동 시스템의 I/O나 CPU 사용정보 등
① 현실을 감안한 최적화
- 위의 예시에서 B인덱스 조건이 A조건보다 적은 범위를 처리하고 있다면 옵티마이져는 B인덱스를 처리주관
조건으로 선택
- 분포도 : 통계정보에서 가장 주용한 정보
분포도가 좋다-> 컬럼값의 종류가 많다 ->조건을 만족하는 처리범위가 좁다는 것을 의미하므로 일의 양을 결정하는
가장 중요한 요소
- 컬럼의 모든 값들에 대해 분포도를 가지면 정확하겠지만 불가능
=>컬럼값의 범위별로 분포도 보유하는 방법
- 컬럼값에 저장할 분포도의 종류는 버켓(Bucker)의 개수에 따라 결정
· 넓이균형 히스토그램(Width_balanced Histogram) :버켓에 저장할 분포도는 컬럼값의 최소치와 최대치에 대해
균등한 범위로 분할하여 각 범위별로 보유한 로우의 수를 보관(컬럼값의 종류가 적거나 분포도의 편차가 심하지 않는 경우)
· 높이균형 히스토그램(Height_balanced Histogram) : 총 로우 수를 버켓 수만큼으로 나누어 각 버켓에 저장되는
값의 범위를 기록 (분포도나 컬럼값의 편차가 심한 경우)
=> 두가지 방법은 사용자가 선택 할 수 없음. 단 버켓 수 지정 가능
그러나 DBMS의 패키지 dbms_stats 등의 프로시져를 활용하여 자동 결정DELETEME
② 통계정보의 관리를 통한 제어
- 통계정보를 어떻게 관리할 것이냐을 고심
- 테이블마다 통계정보를 관리할 수 없음
=> 테이블을 모니터링하는 기능 이용
USER_TAB_MODIFICATION와 같은 딕셔너리 뷰를 통해 확인
- 만약 통계테이블을 수동으로 관리 하고자 한다면 수집방법, 수집 주기 결정
=>스크립트 작성, 작업스케줄링 할 수 있는 S/W활용,
제공된 프로시져(GRTHER_DATABASE_STAT 등)
③ 최악의 상황이 발생할 확률의 감소
- 적절하지 못한 인덱스 구성, 고품질의 SQL을 사용하지 못해도 대부분 최소한의 수행 속도 보장
- 사용자의 쿼리를 재해석하여 새로운 쿼리로 변형시킴
① 실행계획 예측의 곤란
-사용자가 예측불가능하므로 애플리케이션을 작성할 때 미리 적절한 대응하기 어렵고, 종합적인 전략을 수립하기 곤란
② 버전에 따른 변화
③ 실행계획 제어가 곤란
① 기존의 아우트라인에서 새로운 개별 아우트라인으로 복제 *CREATE PRIVATE OUTLINE prv_01_1 FROM outln_1; ② 아우트라인을 수정할 수 있는 툴이나 DBMS_OUTLN_EDIT패키지에 있는 여러 프로시져를 갱신 *REFRESH_PRIVATE_OUTLINE 프로시져로 다시 한번 CREATE PRIVATE OUTLINE 명령으로 리플래쉬 ③ 생성된 개별 아우트라인을 검증하기 위해 USE_PRIVATE_OUTLINES을 TRUE로 지정하고 검증 ④ 충분한 검증을 끝내고 공식적인 적용 *CREATE OR REPLACE OUTLINE outln_1 FROM PRIVATE prv_01_1; ⑤ 적용이 되었으면 USE_PRIVATE_OUTLINES을 FALSE로 지정하여 자신의 개별 아우트라인 수행 종료