■dbms_stats 프로시저 사용한다.

 

1. create_stat_table 로 통계테이블을 만든다.

PROCEDURE CREATE_STAT_TABLE
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 OWNNAME                        VARCHAR2                IN
 STATTAB                        VARCHAR2                IN
 TBLSPACE                       VARCHAR2                IN     DEFAULT
 GLOBAL_TEMPORARY               BOOLEAN                 IN     DEFAULT

 

$ sqlplus hr/hr

 

orcl@HR> exec dbms_stats.create_stat_table('hr','stat');

PL/SQL procedure successfully completed.

 

2. export_*_stats 를 통해 통계 테이블로 저장

* 위치에 들어갈 수 있는 값
database, column, dictionary, fixed_object, index, pending, schema, system, table

 

3. 다른 db로 통계 테이블 이동(datapump등 사용)

 

4. import_*_stats 를 통해 통계를 딕셔너리에 입력

* 위치에 들어갈 수 있는 값
database, column, dictionary, fixed_object, index, pending, schema, system, table

 

■LAB

1. export_table_stats를 통해 통계를 테이블에 저장

 

PROCEDURE EXPORT_TABLE_STATS
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 OWNNAME                        VARCHAR2                IN
 TABNAME                        VARCHAR2                IN
 PARTNAME                       VARCHAR2                IN     DEFAULT
 STATTAB                        VARCHAR2                IN
 STATID                         VARCHAR2                IN     DEFAULT
 CASCADE                        BOOLEAN                 IN     DEFAULT
 STATOWN                        VARCHAR2                IN     DEFAULT

 

$ sqlplus hr/hr

 

orcl@HR> exec dbms_stats.export_table_stats('hr','employees',null,'stat');

PL/SQL procedure successfully completed.

 

※stat은 위 1단계에서 만든 통계 저장용 테이블이다.

 

orcl@SYSexec print_table('select * from hr.stat where rownum=1');
STATID                        :
TYPE                          : C
VERSION                       : 5
FLAGS                         : 2
C1                            : EMPLOYEES
C2                            :
C3                            :
C4                            : LAST_NAME
C5                            : HR
N1                            : 103
N2                            : .00462962962962963
N3                            : 103
N4                            : 108
N5                            : 0
N6                            : 339495007414717000000000000000000000
N7                            : 469506047861463000000000000000000000
N8                            : 8
N9                            : 1
N10                           : 21
N11                           : 355127267452184000000000000000000000
N12                           :
D1                            : 23-nov-2015 11:00:08
R1                            : 4162656C
R2                            : 5A6C6F746B6579
CH1                           :
CL1                           :

 

2. import_table_stats를 통해 통계를 dictionary에 저장. 만약 다른 DB라면 export/import or empdp/impdp를 통해 테이블을 넣었을 것이다.

 

PROCEDURE IMPORT_TABLE_STATS
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 OWNNAME                        VARCHAR2                IN
 TABNAME                        VARCHAR2                IN
 PARTNAME                       VARCHAR2                IN     DEFAULT
 STATTAB                        VARCHAR2                IN
 STATID                         VARCHAR2                IN     DEFAULT
 CASCADE                        BOOLEAN                 IN     DEFAULT
 STATOWN                        VARCHAR2                IN     DEFAULT
 NO_INVALIDATE                  BOOLEAN                 IN     DEFAULT
 FORCE                          BOOLEAN                 IN     DEFAULT

 

orcl@HR> exec dbms_stats.import_table_stats('hr', 'employees', null, 'stat');                                                

PL/SQL procedure successfully completed.

 

 

Posted by neo-orcl
,

■통계 복원

만약 실행이 정상적이던 SQL이 특정 시점부터 느려졌다면 실행계획의 변경도 의심해보아야 한다. 만약 실행계획의 변경이 통계정보의 갱신에 의한 변경이고 최적화되지 않았다면 통계의 복원을 사용할 기회이다.

 

dbms_stats.restore_*_stats 프로시저로 이전 통계 복원 가능하다

예:
begin
 dbms_stats.restore_table_stats(ownname=>'oe'
  , tabname=>'inventories'
  , as_of_timestamp=>to_date('2015-12-28 10:00', 'yyyy-mm-dd hh24:mi'));
end;
/

 

or

 

begin
 dbms_stats.restore_table_stats('oe','inventories',to_date('2015-12-28 10:00', 'yyyy-mm-dd hh24:mi'));
end;
/

 


■테이블 통계 변경 내역 확인(테이블만 존재)

단, dbms_stats를 통해 수집한 내역만 확인 가능하다. analyze를 통한것은 기록이 남지 않는다.

 

select * from dba_tab_stats_history
where owner = 'HR'
and table_name='EMP'


orcl@SYS> exec print_table('select * from dba_tab_stats_history where owner = ''HR'' and table_name=''EMP''');
OWNER                         : HR
TABLE_NAME                    : EMP
PARTITION_NAME                :
SUBPARTITION_NAME             :
STATS_UPDATE_TIME             : 29-DEC-15 05.47.24.880458 PM +09:00
-----------------
OWNER                         : HR
TABLE_NAME                    : EMP
PARTITION_NAME                :
SUBPARTITION_NAME             :
STATS_UPDATE_TIME             : 29-DEC-15 06.07.28.041455 PM +09:00
-----------------
OWNER                         : HR
TABLE_NAME                    : EMP
PARTITION_NAME                :
SUBPARTITION_NAME             :
STATS_UPDATE_TIME             : 22-DEC-15 10.00.16.870032 PM +09:00
-----------------

PL/SQL procedure successfully completed.

 

 

■보관주기

기본값은 31일

변경은 dmbs_stats.alter_stats_history_retention 으로 설정한다.

 

15일로 변경 예시

 

orcl@SYS> exec dbms_stats.alter_stats_history_retention(15);

PL/SQL procedure successfully completed.

 

확인

 

orcl@HR> select dbms_stats.get_stats_history_retention from dual;

GET_STATS_HISTORY_RETENTION
---------------------------
                         15

 

■ 프로시저 정보

PROCEDURE RESTORE_DATABASE_STATS
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 AS_OF_TIMESTAMP                TIMESTAMP WITH TIME ZONE IN
 FORCE                          BOOLEAN                 IN     DEFAULT
 NO_INVALIDATE                  BOOLEAN                 IN     DEFAULT
PROCEDURE RESTORE_DICTIONARY_STATS
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 AS_OF_TIMESTAMP                TIMESTAMP WITH TIME ZONE IN
 FORCE                          BOOLEAN                 IN     DEFAULT
 NO_INVALIDATE                  BOOLEAN                 IN     DEFAULT
PROCEDURE RESTORE_FIXED_OBJECTS_STATS
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 AS_OF_TIMESTAMP                TIMESTAMP WITH TIME ZONE IN
 FORCE                          BOOLEAN                 IN     DEFAULT
 NO_INVALIDATE                  BOOLEAN                 IN     DEFAULT
PROCEDURE RESTORE_SCHEMA_STATS
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 OWNNAME                        VARCHAR2                IN
 AS_OF_TIMESTAMP                TIMESTAMP WITH TIME ZONE IN
 FORCE                          BOOLEAN                 IN     DEFAULT
 NO_INVALIDATE                  BOOLEAN                 IN     DEFAULT
PROCEDURE RESTORE_SYSTEM_STATS
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 AS_OF_TIMESTAMP                TIMESTAMP WITH TIME ZONE IN
PROCEDURE RESTORE_TABLE_STATS
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 OWNNAME                        VARCHAR2                IN
 TABNAME                        VARCHAR2                IN
 AS_OF_TIMESTAMP                TIMESTAMP WITH TIME ZONE IN
 RESTORE_CLUSTER_INDEX          BOOLEAN                 IN     DEFAULT
 FORCE                          BOOLEAN                 IN     DEFAULT
 NO_INVALIDATE                  BOOLEAN                 IN     DEFAULT

 

'Knowledge > Perfomance Tuning' 카테고리의 다른 글

Adaptive cursor simple test  (0) 2016.01.02
통계 export/import  (0) 2015.12.29
statistics lock/unlock  (0) 2015.12.29
수동통계수집(gathering statistics manually)  (0) 2015.12.29
histogram 고려사항  (0) 2015.12.29
Posted by neo-orcl
,

■통계 lock

    자동 수집 방지 목적

예: 매번 동적 샘플링하도록 설정
begin
 dbms_stats.delete_table_stats('oe','orders');
 dbms_stats.lock_table_stats('oe','orders');
end;
/

 

예: 대표 값에 대한 통계가 있는 테이블에 대한 통계 lock
begin
 dbms_stats.gather_table_stats('oe','orders');
 dbms_stats.lock_table_stats('oe','orders');
end;
/

 

■ lock 방법

lock_partition_stats
lock_schema_stats
lock_table_stats

 

■unlock 방법

unlock_partition_stats
unlock_schema_stats
unlock_table_stats

 

■통계 lock 되었는지 확인하는 방법

 

select table_name, stattype_locked from user_tab_statistics
where stattype_locked='ALL';

 

※stattype은 기본값이 ALL이며 아직까진 다른 옵션은 개발되지 않은 것으로 보인다. 매뉴얼에도 없다.

 

■통계가 lock되어있더라도 강제 갱신 방법

통계가 lock된 테이블이나 테이블의 종속(인덱스, 열, 히스토그램)된 객체에 통계 갱신이나 수집, import를 시도하면
아래처럼 ora-20005를 만난다.

 

SQL> exec dbms_stats.gather_index_stats(null, 'LOCK_TEST_IDX')
BEGIN dbms_stats.gather_index_stats(null, 'LOCK_TEST_IDX'); END;

*
ERROR at line 1:
ORA-20005: object statistics are locked (stattype = ALL)
ORA-06512: at "SYS.DBMS_STATS", line 10872
ORA-06512: at "SYS.DBMS_STATS", line 10896
ORA-06512: at line 1

 

이때 force 옵션을 사용하면 갱신 가능하다.

SQL> exec dbms_stats.gather_index_stats(null, 'LOCK_TEST_IDX', force=>true);
PL/SQL procedure successfully completed.

Posted by neo-orcl
,

■ 통계를 수동으로 수집해야 하는 시기

 

다음에 대해 수동으로 수집해야 한다.
- 휘발성 객체

- batch 처리 작업에서 수정되는 객체: 배치 처리 작업의 일부로 통계를 수집

- external table, system통계, fixed object

- 새로운 객체: 객체 생성 후 통계 수집

 

external 테이블은 샘플링이 지원되지 않아 estimate_percent 옵션을 명시적으로 null 설정해야 한다.
external 테이블에 대한 데이터 조작이 허용되지 않기에 해당 파일이 변경될 때만 통계 수집하면 충분한다.

 

■ 수동 통계 수집

dbms_stats는 optimize에 필요한 통계만 수집하고 다른 통계 수집은 하지 않는다.

- 예를 들어 테이블이라면 num_rows, 데이터가 있는 block count, 평균 행 길이는 포함되지만 체인된 row수, 평균 사용 가능 공간, 사용되지 않은 데이터 블럭 수는 미포함한다.

 

analyze문의 compute와 estimate 절은 역호환성을 위해서만 지원된다.

analyze문의 validate, list chained, free list 블록에 대한 정보 수집은 계속 사용 가능하다.

 

■ 수동 통계 수집 프로시저

-gather_index_stats
-gather_table_stats
-gather_schema_stats
-gather_dictionary_stats
-gather_database_stats
-gather_system_stats

-gather_fixed_objects_stats

 

PROCEDURE GATHER_DATABASE_STATS
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 ESTIMATE_PERCENT               NUMBER                  IN     DEFAULT
 BLOCK_SAMPLE                   BOOLEAN                 IN     DEFAULT
 METHOD_OPT                     VARCHAR2                IN     DEFAULT
 DEGREE                         NUMBER                  IN     DEFAULT
 GRANULARITY                    VARCHAR2                IN     DEFAULT
 CASCADE                        BOOLEAN                 IN     DEFAULT
 STATTAB                        VARCHAR2                IN     DEFAULT
 STATID                         VARCHAR2                IN     DEFAULT
 OPTIONS                        VARCHAR2                IN     DEFAULT
 STATOWN                        VARCHAR2                IN     DEFAULT
 GATHER_SYS                     BOOLEAN                 IN     DEFAULT
 NO_INVALIDATE                  BOOLEAN                 IN     DEFAULT
 GATHER_TEMP                    BOOLEAN                 IN     DEFAULT
 GATHER_FIXED                   BOOLEAN                 IN     DEFAULT
 STATTYPE                       VARCHAR2                IN     DEFAULT
 OBJ_FILTER_LIST                OBJECTTAB               IN     DEFAULT

 

PROCEDURE GATHER_SCHEMA_STATS
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 OWNNAME                        VARCHAR2                IN
 ESTIMATE_PERCENT               NUMBER                  IN     DEFAULT
 BLOCK_SAMPLE                   BOOLEAN                 IN     DEFAULT
 METHOD_OPT                     VARCHAR2                IN     DEFAULT
 DEGREE                         NUMBER                  IN     DEFAULT
 GRANULARITY                    VARCHAR2                IN     DEFAULT
 CASCADE                        BOOLEAN                 IN     DEFAULT
 STATTAB                        VARCHAR2                IN     DEFAULT
 STATID                         VARCHAR2                IN     DEFAULT
 OPTIONS                        VARCHAR2                IN     DEFAULT
 STATOWN                        VARCHAR2                IN     DEFAULT
 NO_INVALIDATE                  BOOLEAN                 IN     DEFAULT
 GATHER_TEMP                    BOOLEAN                 IN     DEFAULT
 GATHER_FIXED                   BOOLEAN                 IN     DEFAULT
 STATTYPE                       VARCHAR2                IN     DEFAULT
 FORCE                          BOOLEAN                 IN     DEFAULT
 OBJ_FILTER_LIST                OBJECTTAB               IN     DEFAULT

 

PROCEDURE GATHER_TABLE_STATS
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 OWNNAME                        VARCHAR2                IN
 TABNAME                        VARCHAR2                IN
 PARTNAME                       VARCHAR2                IN     DEFAULT
 ESTIMATE_PERCENT               NUMBER                  IN     DEFAULT
 BLOCK_SAMPLE                   BOOLEAN                 IN     DEFAULT
 METHOD_OPT                     VARCHAR2                IN     DEFAULT
 DEGREE                         NUMBER                  IN     DEFAULT
 GRANULARITY                    VARCHAR2                IN     DEFAULT
 CASCADE                        BOOLEAN                 IN     DEFAULT
 STATTAB                        VARCHAR2                IN     DEFAULT
 STATID                         VARCHAR2                IN     DEFAULT
 STATOWN                        VARCHAR2                IN     DEFAULT
 NO_INVALIDATE                  BOOLEAN                 IN     DEFAULT
 STATTYPE                       VARCHAR2                IN     DEFAULT
 FORCE                          BOOLEAN                 IN     DEFAULT

 

PROCEDURE GATHER_INDEX_STATS
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 OWNNAME                        VARCHAR2                IN
 INDNAME                        VARCHAR2                IN
 PARTNAME                       VARCHAR2                IN     DEFAULT
 ESTIMATE_PERCENT               NUMBER                  IN     DEFAULT
 STATTAB                        VARCHAR2                IN     DEFAULT
 STATID                         VARCHAR2                IN     DEFAULT
 STATOWN                        VARCHAR2                IN     DEFAULT
 DEGREE                         NUMBER                  IN     DEFAULT
 GRANULARITY                    VARCHAR2                IN     DEFAULT
 NO_INVALIDATE                  BOOLEAN                 IN     DEFAULT
 STATTYPE                       VARCHAR2                IN     DEFAULT
 FORCE                          BOOLEAN                 IN     DEFAULT

 

PROCEDURE GATHER_DICTIONARY_STATS
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 COMP_ID                        VARCHAR2                IN     DEFAULT
 ESTIMATE_PERCENT               NUMBER                  IN     DEFAULT
 BLOCK_SAMPLE                   BOOLEAN                 IN     DEFAULT
 METHOD_OPT                     VARCHAR2                IN     DEFAULT
 DEGREE                         NUMBER                  IN     DEFAULT
 GRANULARITY                    VARCHAR2                IN     DEFAULT
 CASCADE                        BOOLEAN                 IN     DEFAULT
 STATTAB                        VARCHAR2                IN     DEFAULT
 STATID                         VARCHAR2                IN     DEFAULT
 OPTIONS                        VARCHAR2                IN     DEFAULT
 STATOWN                        VARCHAR2                IN     DEFAULT
 NO_INVALIDATE                  BOOLEAN                 IN     DEFAULT
 STATTYPE                       VARCHAR2                IN     DEFAULT
 OBJ_FILTER_LIST                OBJECTTAB               IN     DEFAULT

 

PROCEDURE GATHER_FIXED_OBJECTS_STATS
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 STATTAB                        VARCHAR2                IN     DEFAULT
 STATID                         VARCHAR2                IN     DEFAULT
 STATOWN                        VARCHAR2                IN     DEFAULT
 NO_INVALIDATE                  BOOLEAN                 IN     DEFAULT

 

PROCEDURE GATHER_SYSTEM_STATS
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 GATHERING_MODE                 VARCHAR2                IN     DEFAULT
 INTERVAL                       NUMBER(38)              IN     DEFAULT
 STATTAB                        VARCHAR2                IN     DEFAULT
 STATID                         VARCHAR2                IN     DEFAULT
 STATOWN                        VARCHAR2                IN     DEFAULT

 

Posted by neo-orcl
,

개요

 

자동 통계 수집은 gather_stats_prog 를 통해 자동화된다

 

프로시저

exec dbms_stats.set_global_prefs
exec dbms_stats.set_database_prefs
exec dbms_stats.set_schema_prefs
exec dbms_stats.set_table_prefs

 

프로시저 속성

- cascade: 인덱스에 대한 통계도 수집한다. 단, 이는 병렬화되지 않는다

- estimate_percent

통계 계산에 사용되는 행의 예측 비율(null은 모든 행을 의미)로 0.000001~100 설정 가능하다.
시스템이 자동으로 적정 샘플 크기를 결정하도록 하게 하려면 dbms_stats.auto_sample_size 사용한다.(기본값)

 

- no_invalidate

통계 수집할 테이블의 종속 커서 무효화를 제어한다.
true-종속 커서가 무효화되지 않음, false-종속 커서가 무효화됨
시스템이 무효화해야 하는 시기를 결정하도록 하려면 dbms_stats.auto_invalidate를 사용한다(기본값)

- publish

통계를 딕셔너리에 저장하거나 업데이트 할 지, pending area에 저장할 것인지 결정한다.
pending statistics 기능과 연관이 있다

 

- stale_percent: 객체 통계가 오래된 기준을 정한다. 마지막 통계 수집 이후 수정된 행의 비율이다. 기본값 10%

- degree

통계 계산에 사용되는 병렬도이다. 기본값은 null이며 이는 create table이나 alter table 문에서 degree 절로 지정된 테이블의   기본값을 사용함을 의미한다.
init parameter값을 기반으로 기본값 지정하려면 dbms_stats.default_degree 사용한다.
auto_degree 값은 병렬도를 자동 결정한다. 객체 크기에 따라 1 또는 default_degree(cpu수와 init parameter 기반하는 시스템 기본값)이다


- method_opt: 히스토그램 수집에 사용되는 sql 문자열. 기본값은 for all coluns size auto이다.

- granulity: partition 테이블에 대해 수집할 통계의 단위이다. global이거나 partition단위 일 수 있다.

- incremental

partition 테이블의 global 통계를 incremental 방식으로 수집하는데 사용한다.

 

※ 만약 테이블 단위로 수집 관련 속성을 dbms_stats.set_table_prefs 통해 설정했다면 dba_tab_stat_prefs 뷰를 사용하여 확인할 수 있다.

'Knowledge > Perfomance Tuning' 카테고리의 다른 글

수동통계수집(gathering statistics manually)  (0) 2015.12.29
histogram 고려사항  (0) 2015.12.29
시스템 통계 수집(gathering system statististics)  (0) 2015.12.29
Additional statistics  (0) 2015.12.19
Common wait events  (0) 2015.12.19
Posted by neo-orcl
,

■ 개요

시스템 통계 수집은 정기적으로 이루어져야 한다.

시스템 통계 수집은 기존 실행계획을 무효화하지 않는다.

 

■ 프로시저

dbms_stats.gather_system_stats: 시스템 통계 수집
dbms_stats.set_system_stats: 명시적으로 직접 설정
dbms_stats.get_system_stats: 시스템 통계 정보를 확인

 

gathering_mode:

- noworkload | interval
- start | stop

 

noworkload: 기본값, 몇분 정도 걸릴 수 있고 DB크기에 따라 다르다.
                    DB와 테이블스페이스 생성 후 gather_system_stats('noworkload')를 실행할 것을 권장한다.
interval: 지정된 간격동안 시스템 작업을 캡쳐한다.

 

start | stop: 시작 정지를 지정할 수 있다. 예를 들어 시작 후 작업을 걸고 stop하여 정확한 통계를 수집할 수 있다.

 

※10gR2부터는 시작 시 시스템 통계 필수 부분이 자동으로 수집된다

 

■ 시스템 통계 수집 예제1

exec dbms_stats.gather_system_stats(interval => 120, stattab => 'mystats',statid => 'OLTP'); --첫째날 낮
exec dbms_stats.gather_system_stats(interval => 120, stattab => 'mystats',statid => 'BATCH'); --첫째날 밤
exec dbms_stats.import_system_stats(stattab='mystats',statid='OLTP'); --낮에는 이 통계를 사용하도록 dictionary에 import
exec dbms_stats.import_system_stats(stattab='mystats',statid='DW'); --밤에는 이 통계를 사용하도록 dictionary에 import

 

※위 작업 전에 먼저 통계용 테이블을 dbms_stats.create_stat_table 을 통해 만들어야 한다.

 

■ 시스템 통계 수집 예제2

exec dbms_stats.gather_system_stats(gathering_mode => 'start');

 

workload 수행

exec dbms_stats.gather_system_stats(gathering_mode => 'stop');

 

위 예제는 해당 워크로드가 수행될 때의 시스템 통계를 수집하는 것이 목적이다.

 

'Knowledge > Perfomance Tuning' 카테고리의 다른 글

수동통계수집(gathering statistics manually)  (0) 2015.12.29
histogram 고려사항  (0) 2015.12.29
자동 통계 수집(automatic statistics gathering)  (0) 2015.12.29
Additional statistics  (0) 2015.12.19
Common wait events  (0) 2015.12.19
Posted by neo-orcl
,

요약, 번역한 내용. 당연한 내용과 익히 알만한 내용은 제외했다

 

정리

- 가능하다면 개별의 통계정보를 수집하는 것이 좋다.
- 테이블에 대한 통계정보는 5%가 일반적으로 적당하다.
- 인덱스에 대해선 compute 로 한다.
- histogram은 데이터가 skew되었다고 알려진 컬럼에 대해 추가한다

 

정리에 대한 설명

- 일반적으로 대부분의 테이블에 대한 통계정보는 5%가 적당하지만 가능하다면 100%로 하는 것이 추천된다.
- 테이블에 대한 통계정보 수집은 정렬을 필요로 하기에 성능과 시간과 연관이 있게 된다.
- 하지만 인덱스의 경우에는 이미 정렬이 되어 있기에 100%로 한다 하더라도 성능은 허용할만 하다.
- 컬럼에 대한 histogram은 일정한 분포도를 벗어나는 컬럼에 대해 적합하다.

 

자세히

아래 내용은 의견을 모은 것이다(오라클의 공식 가이드는 아니다)

 

- 다른 시스템의 다른 시스템에는 다른 레벨의 통계정보 수집이 필요하다.

 

- 통계정보를 수집하는 이유는 CBO가 '좋은' 실행 계획을 세우기 위해 가장 좋은 정보를 제공하는 것이다.

 

- 정확성은 샘플 사이즈에 의존하게 된다.

- Computed 통계라고 하더라도 CBO가 반드시 Best plan을 선택하는 것은 아니다. 왜냐면 optimizer는 선척적으로 추측하고 사용하는 정보는 제한적이기 때문이다.

 

- 얼마나 자주 통계 수집을 하는지는 오브젝트가 얼마나 자주 변경되는지에 따라, 또한 통계가 얼마만에 부정확해지는가에 따라 결정된다.

 

- 좋은 sample size를 정하기 위한 가장 좋은 방법은 다른 샘플 크기로 통계를 수집해 결과를 확인하는 것이다. 낮은 수치부터 진행하다보면 어떤 포인트에서 결과가 일정하게 보이기 시작할 것이다.

 

- 통계정보는 되도록 사용시간대가 없는 때 하도록 해야 한다. 통계수집중인 오브젝트에 update나 insert 등이 진행중이라면 경합을 겪을 수 있다.

 

- 통계 수집 주기를 결정하기 위해서는 before 결과값과 after 결과값을 기록해두어 after가 변하는 시점이 적절한 수집 주기일 것이다.

 

- 만약 before 결과값과 after 결과값이 자주 다를 경우, 데이터 성격이 예측 불가능하거나 데이터의 크기에 비해 샘플 크기가 너무 작거나 데이터가 너무 랜덤할 경우 중 하나일 것이다. 이 경우 통계 수집은 어떤 방법을 써도 한계가 있게 된다. 이 때는 다른 방법으로 쿼리에 대한 실행계획을 세우는 방법을 써야 한다.(힌트라던가?)

 

- CBO의 기본 cost 계산법을 사용하고 있다면? 새로운 통계를 수집했을 때 몇몇 문장에 대해 다른 실행계획이 세워질 수 있다.

- 이는 데이터 성격이 바뀌었을 경우 CBO가 접근 경로를 바꾸게 되는 정상적인 동작이다.

- 그런데 다른 실행계획이 기존 실행계획보다 나쁠 수도 있다. 차이는 클 수도 있고 작을 수도 있다.
- 약간 다른 기본정보가 CBO에게 주어지면 다른 계획을 선택할 수 있다.

 

- 대부분의 시스템에서는 예측가능성이 최적의 성능보다 더 중요하다. 위에서 본 불안정한 영향을 미칠 수 있는 통계 수집보다는 분명하다.

- 이 말은 통계 수집을 쓰지 말하는 것은 아니다. 하지만 무슨 일이 일어날지 알아야 한다.

 

- 통계 정보 수집 후 시스템의 성능에 중요한 영향을 미치는 문장에 대해 허용하는 시간 안에 응답을 하는지 테스트 머신에서 먼저 테스트해봐야 한다

 

- 중요한 통계정보는 통계정보가 바뀜으로 인해 실행계획이 바뀌어 어플 성능이 떨어졌을 경우를 대비해 이전 통계를 저장하는 것을 권장한다.

- 10g부터는 기본적으로 31일동안은 이전의 통계정보를 저장한다.
- 만약 통계 수집의 결과로 중요한 문장에 대한 성능이 떨어졌다면 이전의 통계로 되돌릴 수 있다.

 

- 어떤 문장이든지 성능에 영향을 줄 수 있으나 이들을 찾는건 쉽지 않다.

- 하지만 만약 찾았다면. 일반적으로 plan stability 기능 혹은 힌트를 사용하는 것이 안정적인 실행계획을 위해서 가장 좋은 방법이다.
- DW/DSS 환경에서는 쿼리를 예측할 수 없기에 위에서 말한 방법을 사용할 수 없다. 수집된 통계정보에 맡겨야 한다.

 

'Knowledge > Oracle' 카테고리의 다른 글

About Sequence  (0) 2014.03.07
User 생성시 quota 관련 주의점  (0) 2014.01.09
Procedure Debug 권한 부여  (0) 2013.06.26
Oracle Standard Edition 으로 RAC 구성시 제약사항  (0) 2013.05.21
Oracle process and Files  (0) 2013.03.18
Posted by neo-orcl
,