엑세스 효율에 가장 결정적인 영향을 미치는 것 은 수립된 실행계획이다.
목표 : 그러므로 실행계획을 이해하고 제어하는 것이 중요하다.
Clustering Factor 란 Index 의 Table에 대한 정렬 정도(orderedness)이다.
이것은 index를 scan하는 동안 방문(access) 하게되는 Table의 Data Block 의 개수이다.
즉 넓은 범위의 Data를 Index를 경유해서 읽을 경우 Clustering Factor 가 Physical Reads 의 발생 빈도에 큰 영향을 미친다.
01 > ROWID 로 1 로우 액세스
02 > 클러스터 조인에 의한 1 로우 액세스
03 > Unique HASH Cluster 에 의한 1 로우 액세스
04 > Unique Index 에 의한 1 로우 엑세스
05 > Cluster 조인
06 > Non Unique Hash cluster key
07 > Non Unique cluster key
08 > Non Unique 결합 인덱스
09 > Non unique 한 컬럼 인덱스
10 > index 에 의한 범위처리
11 > index 에 의한 전체범위처리
12 > Sort Merge 조인
13 > 인덱스 컬럼의 Min, MAX 처리
14 > 인덱스 컬럼의 order by
15 > 전체테이블 스켄
어떤 유형의 인덱스를 어떤 연산자를 사용하였는지 순위차이는 있다.
질의 최적화(query optimization)에서 RBO(Rule Base Optimizer)는 정해진 랭킹(ranking)에 의해 플랜을 결정한다. 같은 랭킹이라면 Where
절의 뒤부터, From절 뒤의 객체가 우선 순위를 갖는다. 한 객체(예 : 테이블)에서 같은 랭킹의 인덱스가 있다면 가장 최근에 만들어진 인덱스를 사용한다. 이는 CBO(Cost Base Optimizer)에서도 같이 적용되는 사항이다.
SQL> create index emp_a on emp(deptno);
Index created.
SQL> create index emp_b on emp(deptno, empno);
Index created.
SQL> select /*+rule */* from emp where deptno =10 and empno between 7888 and 8888;
---------------------------------------------
| Id | Operation | Name |
---------------------------------------------
| 0 | SELECT STATEMENT | |
|* 1 | TABLE ACCESS BY INDEX ROWID| EMP |
|* 2 | INDEX RANGE SCAN | EMP_A |
---------------------------------------------
09 > Non unique 한 컬럼 인덱스 EMP_A index
10 > index 에 의한 범위처리 EMP_B index
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("EMPNO"<=8888 AND "EMPNO">=7888)
2 - access("DEPTNO"=10)
위 경우 이상적인 index를 타는 경우는 EMP_B index를 타는 것이다.
access("DEPTNO"=10 AND "EMPNO">=7888 AND "EMPNO"<=8888)
[USER|ALL|DBA]_TABLES
num_rows, blocks, avg_row_len, sample_size, last_analyzed
[USER|ALL|DBA]_INDEXES
BLEVEL ,LEAF_BLOCKS ,DISTINCT_KEYS ,AVG_LEAF_BLOCKS_PER_KEY, AVG_DATA_BLOCKS_PER_KEY, CLUSTERING_FACTOR,NUM_ROWS,SAMPLE_SIZE ,LAST_ANALYZED
[USER|ALL|DBA]_TAB_COLUMN
NUM_DISTINCT,LOW_VALUE ,HIGH_VALUE,DENSITY , NUM_NULLS ,NUM_BUCKETS , LAST_ANALYZED ,SAMPLE_SIZE ,AVG_COL_LEN
[USER|ALL|DBA]_TAB_HISTOGRAMS
OWNER , TABLE_NAME, COLUMN_NAME, ENDPOINT_NUMBER , ENDPOINT_VALUE , ENDPOINT_ACTUAL_VALUE
통계정보 중 가장 중요한 정보는 분포도 라고 할 수 있으며, 여기서 분포도가 좋다라는 것은 컬럼값의 종류가 많다는 것이며
이것은 곧 조건을 만족하는 처리 범위가 좁다는 의미하므로 일의 양을 결정하는 중요한 요소 이다.
여기서 문제는 분포도 라는 정보가 결합인덱스 또는 다양한 연산자를 사용하는 경우 불완전한 분포드 정보가 나올 가능성이 높다는 점이다.
모든 컬럼 값에 대해 분포도를 가지기에는 어려움이 있으므로 값을 저장하는 방식에는 두가지 있다.
넓이 균형 히스토그램(Width_balanced Histogram) : 값(Value)의 Distinct Count와 Bucket 수가 일치하는 경우 정확한 컬럼 개수 값을 가지고 있다.
높이 균형 히스토그램(Height_balanced Histogram) : 값(Value)의 Distinct Count가 Bucket 수보다 많은 경우 값마다 Bucket을 하나씩 할당
할 수 없으므로 값들을 적당한 Bucket으로 분배
-- 참조 : 2011년 상반기 대용량데이터베이스 스터디 Frequency vs. Height-Balanced (작성자 : 노준기)
통계정보를 관리 함으로서 테이블을 모니터링 할 수가 있다. Insert, update, delete 에 대한 발생 정보를 개략적으로 모니터링 가능.
통계정보관리는 제공된 프로시져를 이용하여 관리하는 것이 좋다.
h6.나) 비용기준 옵티마이져의 단점
시스템의 CPU, I/O 성능, 메모리성능, 등 성능에 따른 변수가 있을 수 있으므로 시스템 통계를 측정하여 좀 더 정확한
정보를 옵티마이져에게 제공함으로써 좀 더 정확한 통계정보를 가질 수 있다.
시스템 통계정보는 지정한 기간동안 시스템을 모니터링 함으로써 측정하는 부분이다.
(일반적으로 업무시간을 위주로 어느정도 시간의 Delta 값을 측정하는지..)
SYSTEM 통계 정보_info
select * from aux_stats$;
수집
SQL> exec dbms_stats.gather_system_stats(gathering_mode => 'START');
~~~~ 이 시기 동한 발생된 워크로드를 분석해서 aux_stats$ 반영
SQL> exec dbms_stats.gather_system_stats(gathering_mode => 'STOP');
삭제
SQL> exec dbms_stats.delete_system_stats();
- 통계 정보 수집하는 경우 주의점은 Sample Data 의 양이다.
일반적으로 5% 이하 선정하는데 바람직하다고 한다. 하지만 데이터 양의 따라 제약조건이 있으므로 검토가 필요.
Analyze & DBMS_STAT 차이점
Analyze | Serial statistics gathering 기능
전체 클러스터 테이블에 대한 통계정보 수집 가능
각 테이블 파티션, 인덱스에 대해서 수집하고 , Global statistics 는 파티션 정보를 가지고 계산( 비정확 )
Analyze 에서만 가능한 기능.
Structural integrity check ( analyze (index/table/cluster) (schema.)(index/table/cluster) validate structure (cascade)(into schema table)
Chained rows 수집 ( analyze table order_hist list chained rows into <user_tabs> )
DBMS_STAT | Parallel statistics gathering 기능
Partition , sub partition 이 있는 경우에는 DBMS_STAT 이용
전체 클러스터 테이블에 대한 통계정보 수집 불가
DBMS_STAT 는 CBO 관련 통계만 수집. (즉 EMPTY_BLOCKS ,AVG_SPACE, CHAIN_CNT 수집 않함)
통계정보를 저장가능, 각 컬럼, 테이블, 인덱스, 스키마 반영가능
DBMS_STAT import /export 가능
Oracle 10.2.0.4 통계정보에 DBMS_STATS Package 으로 제공.
* 통계정보를 비교시 일반적으로 현재,과거 를 비교하므로 과거의 통계정보의 백업(export)가 필요하며
자동적으로 백업되는 부분은 DBA_TAB_STATS_HISTORY View 조회된다 (10g 부터)
dbms_stats.diff_table_stats_in_stattab(user,'table1','table1_old');
exec dbms_stats.export_table_stats(user,'t1',null,'t1_stat');
exec dbms_stats.import_table_stats(user,'t1',null,'t1_stat');
SQL> exec dbms_stats.gather_table_stats('JIN','EMP');
PL/SQL procedure successfully completed.
SQL> select table_name, stats_update_time from dba_tab_stats_history where table_name = 'EMP'
TABLE_NAME STATS_UPDATE_TIME
------------------------------ ---------------------------------------------------------------------------
EMP 28-JUL-11 10.00.17.072692 PM +09:00
EMP 25-AUG-11 11.35.21.381488 AM +09:00
SQL> select OWNER,TABLE_NAME,LAST_ANALYZED from dba_tables where OWNER='JIN' and TABLE_NAME='EMP';
OWNER TABLE_NAME LAST_ANALYZE
------------------------------ ------------------------------ ------------
JIN EMP 25-AUG-11
SQL> exec dbms_stats.restore_table_stats('JIN','EMP','28-JUL-11 10.00.17.072692 PM +09:00');
PL/SQL procedure successfully completed.
SQL> select OWNER,TABLE_NAME,LAST_ANALYZED from dba_tables where OWNER='JIN' and TABLE_NAME='EMP';
OWNER TABLE_NAME LAST_ANALYZE
------------------------------ ------------------------------ ------------
JIN EMP 28-JUL-11
h6.가) 옵티마이져 모드의 종류
저자는 default mode 인 All_rows 보다는 First_rows 를 기본 모드를 권장하고 있다.
이유는 대부분의 시스템은 OLTP 업무가 보다 많은 비중을 차지하고 있으며, 온라인 화 면을 통한 처리는 화면의 크기에 제한이 있고,
사람의 인지능력에도 한계가 있으므로 대부분 일단 일정량이 먼저 나타나는 형태이다.
first_row 로 지정했다고 해서 전체범위를 처리하지 않은 것은 아니며, 모드에 따라서 항상 다른 실행계획이 나타나는것은 더욱 아니다.
논리적으로 전체 범위를 엑세스해야만 결과를 제공 할 수 있다면 옵티마이져 모드가 어떤 것이든 거의 동일한 실행계획을 제공한다.
그러나 부분 범위로 처리되는 SQL 이 만약 ALL_ROWS 모드로 최적화 하게 되면 전체결과를 최적화 하는 방식의 실행계획이 나타나는 경우가 많이 있다.
Partitioned tables
Index-organized tables
Reverse key indexes
Function-based indexes
SAMPLE clauses in a SELECT statement
Parallel execution and parallel DML
Star transformations
Star joins
Extensible optimizer
Query rewrite (materialized views)
Progress meter
Hash joins
Bitmap indexes
Partition views (release 7.3)
Hint
Parallel DEGREE & INSTANCES - 'DEFAULT'도 해당
h6.나) 옵티마이져 모드의 결정 기준
OLTP 환경 (CHOOSE :9i) > First_rows
신규 OLTP 환경 > First_rows_n
OLAP 환경 > ALL_ROWS
물론 절대적인 기준은 아니다. 다만 저자는 RDBMS 사용하는 목적에 따라서 위와 같은 옵티마이져가
적절하다고말하고 있다.
모드를 변경하거나 업그레이드로 인한 변경된 옵티마이져를 적용 할 시 충격을 줄이는 대책
옵티마이져 버젼을 과거에 사용하던 버젼으로 지정하는 방법
Parameter OPTIMIZER_FEATURES_ENABLE
Modifiable ALTER SESSION, ALTER SYSTEM
해당 값을 변경되면 옵티마이져 관련된 Hidden Parameter 도 적용된다.
다만 상위 버젼의 개선된 값이 False 되는 것과 대표적인 값만 바뀐다.
오히러 사라진 Parameter 도 있기 때문에 완벽한 호환성은 아니다.
기존 구 버젼의 Parameter 도 최적화로 instance 튜닝이 되어 있다면 거기에 대한 값도 사용자가 고려해서 반영해야 된다.
아래는 같은 11.2.0.1 > 11.1.0.7 옵티마이져 기능을 바꾸는 경우 추가적으로 변경이 Parameter 도 있다.
PARAMETERS TO CHANGE 11.2.0.1 TO 11.1.0.7 [ID 1096377.1]
These are the parameters that are changed when setting optimizer_features_enable=11.1.0.7 in 11.2.0.1 database.
These values represent OFE=11.1.0.7
alter session set "_optimizer_coalesce_subqueries" = false ;
alter session set "_optimizer_distinct_placement" = false ;
alter session set "_optimizer_unnest_disjunctive_subq" = false ;
alter session set "_optimizer_unnest_corr_set_subq" = false;
alter session set "_optimizer_distinct_agg_transform" = false;
alter session set "_optimizer_fast_pred_transitivity" = false ;
alter session set "_optimizer_fast_access_pred_analysis" = false;
alter session set "_aggregation_optimization_settings" = 32 ;
alter session set "_optimizer_eliminate_filtering_join" = false;
alter session set "_optimizer_join_factorization" = false ;
alter session set "_optimizer_use_cbqt_star_transformation" = false ;
alter session set "_optimizer_connect_by_elim_dups" = false ;
alter session set "_connect_by_use_union_all" = old_plan_mode;
alter session set "_optimizer_table_expansion" = false;
alter session set "_and_pruning_enabled" = false ;
alter session set "_optimizer_use_feedback" = false ;
alter session set "_optimizer_try_st_before_jppd" = false ;
alter session set "_optimizer_undo_cost_change' = '11.1.0.7' ;
h6.다) 옵티마이져 모드와 관련된 파라메터 지정
주의 할 점은 Parameter 들이 통계정보에 미치는 영향이 크기 때문에 신중한 검토가 필요하다.
출처: Oracle Database Reference