본문 바로가기

빅데이터과정/SQL TUNING

#37_140805_TUNING_DYNAMIC SAMPLING

728x90

# DYNAMIC SAMPLING







옵티마이저 동적 표본 추출 작업

• 샘플링은 컴파일 시 수행됩니다.

• 동적 표본 추출 기능을 사용하여 질의를 수행하는 경우 다음과
같은 결과가 나타납니다.
– 데이터 표본 추출을 위해 반복적인 SQL 문이 실행됩니다.
– 샘플링된 블록 수는 OPTIMIZER_DYNAMIC_SAMPLING 초기화
파라미터에 따라 다릅니다.

• 동적 샘플링 동안 선택성을 확인하기 위해 표본에 술어가
적용됩니다.

• 다음 경우에 동적 표본 추출을 사용합니다.
– 표본 추출 시간이 실행 시간의 극히 일부에 불과한 경우
– 질의가 여러 번 실행되는 경우
– 더 좋은 계획을 찾을 수 있다고 판단되는 경우


SELECT * FROM EMP100 WHERE ename='scott1';




SELECT * FROM EMP100 WHERE ename='scott99';





만약에 통계정보를 지우고 확인하면 둘다 index range scan을 한다
EXEC dbms_stats.delete_table_stats('SCOTT','EMP100');

SELECT * FROM EMP100 WHERE ename='scott1';



SELECT * FROM EMP100 WHERE ename='scott99';



위의 과정이 의미하는 것은 통계정보를 수집하면 제대로된 수행계획을 세우지만 없으면 잘못된 수행계획을 세운다
그래서 위와 같이 통계정보를 수집하지 않고 정확한 실행계획을 보려면 아래 처럼 수행하면 된다
SELECT /*+ dynamic_sampling(emp100 10) */ * FROM EMP100 WHERE ename='scott1';
SELECT /*+ dynamic_sampling(emp100 10) */ * FROM EMP100 WHERE ename='scott99';
/*+ dynamic_sampling(emp100 10) */
통계정보가 없거나 오래됐을 때 통계정보를 수집하지 않고 이 힌트만 써서 지금 수행하는 이 SQL만 기본적인 통계정보를 수집하는 힌트
: 10이 의미하는 것은 통계정보를 수집하는 정도인데 1~10까지 설정가능하고 숫자가 클수록 많은 정보를 수집





dynamic sampling 기능을 시스템 레벨에서 키는 법

SQL> show parameter optimizer dynamic
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
optimizer_capture_sql_plan_baselines boolean     FALSE
optimizer_dynamic_sampling           integer     0
optimizer_features_enable            string      11.2.0.1
optimizer_index_caching              integer     0
optimizer_index_cost_adj             integer     100
optimizer_mode                       string      ALL_ROWS
optimizer_secure_view_merging        boolean     TRUE
optimizer_use_invisible_indexes      boolean     FALSE
optimizer_use_pending_statistics     boolean     FALSE
optimizer_use_sql_plan_baselines     boolean     TRUE
SQL> alter system set optimizer_dynamic_sampling=3;
SQL> shutdown immediate
SQL> startup

dynamic sampling 힌트를 안쓰고 아래와 같이 수행하면 통계정보를 수집하면서 정상적인 수행결과를 세운다

SELECT * FROM EMP100 WHERE ename='scott1';




SELECT * FROM EMP100 WHERE ename='scott99';




'빅데이터과정 > SQL TUNING' 카테고리의 다른 글