Analyze는 Serial Statistics Gathering 기능 , DBMS_STATS은 Parallel Gathering 기능

1. Analyze는 파티션의 통계정보를 각 파티션 테이블과 인덱스에 대해서 수집하고, Global Statistics는 파티션 정보를 가지고 계산하므로, 비정확할 수 있다. 그러므로 파티션 또는 서브파티션이 있는 객체에는 DBMS_STATS을 사용 해야 함. 

2. DBMS_STATS은 전체 클러스터에 대해서는 통계정보를 수집하지 않으므로 Analyze를 사용

3. DBMS_STATS은 CBO와 관련된 통계정보만을 수집한다. 테이블의 EMPTY_BLOCKS, AVG_SPACE,CHAIN_CNT 등은 수집되지 않는다. 

4. DBMS_STATS은 사용자가 지정한 통계정보 테이블에 수집된 통계정보를 저장할수있고, 딕셔너리로 각 칼럼, 테이블, 인덱스, 스키마등을 반영할수있다. 

5. DBMS_STATS은 IMPORT/EXPORT 기능 및 추가적인 기능이 많다. 이 기능 을 이용하여 운영 DB의 통계정보를 개발장비의 통계정보로 복사할 수 있으므로 개발장비의 플랜을 운영장비와 같게 만들 수 있다. 

다음은 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 ;

————————————————————————-

결론: analyze 직후 dbms_stats하면 admin stat과 optimizer stat이 제대로 merge됨.

drop table  blueone;

create table  blueone

pctfree 5

storage( initial 1M next 1M pctincrease 0 )

partition by range (object_type)

       (partition  pt  values less than (‘U’),

        partition  pz  values less than (maxvalue)

       )

nologging

as

select *

from  all_objects

where rownum <= 10000

;

update  blueone

   set  SUBOBJECT_NAME = rpad(‘ ‘,30)

;

commit;

analyze table blueone compute statistics;

col  “GLOBAL_STATS”              form a6        heading Global_|Stats

col  “LAST_ANALYZED”             form a20       heading Last_Analyzed

col  “TABLE_NAME”                form a10       heading Table_Name

col  “USER_STATS”                form a6        heading User_|Stats

col  “AVG_ROW_LEN”               form 9999      heading Avg_|Row_|Len

col  “AVG_SPACE”                 form 9999      heading Avg_|Space

col  “AVG_SPACE_FREELIST_BLOCKS” form 9999      heading Avg_|Space_|Freelist_|Blocks

col  “BLOCKS”                    form 99999     heading Blocks

col  “CHAIN_CNT”                 form 9999      heading Chain_|Cnt

col  “EMPTY_BLOCKS”              form 9999      heading Empty_|Blocks

col  “NUM_FREELIST_BLOCKS”       form 9999      heading Num_|Freelist_|Blocks

col  “NUM_ROWS”                  form 99999999  heading Num_|Rows

col  “SAMPLE_SIZE”               form 99999999  heading Sample_|Size

select  table_name, NUM_ROWS, BLOCKS, EMPTY_BLOCKS, AVG_SPACE, CHAIN_CNT, AVG_ROW_LEN, SAMPLE_SIZE, LAST_ANALYZED, AVG_SPACE_FREELIST_BLOCKS, NUM_FREELIST_BLOCKS, GLOBAL_STATS                   

from  all_tables

where  owner = USER

  and  table_name = ‘blueone’

————

union all

————

select  partition_name, NUM_ROWS, BLOCKS, EMPTY_BLOCKS, AVG_SPACE, CHAIN_CNT, AVG_ROW_LEN, SAMPLE_SIZE, LAST_ANALYZED, null, null, null

from  all_tab_partitions

where  table_owner = USER

  and  table_name = ‘blueone’

;

/*

                                                                                          Avg_

                                                 Avg_                                   Space_      Num_

                Num_        Empty_  Avg_ Chain_  Row_   Sample_                      Freelist_ Freelist_ Global

Table_Name      Rows Blocks Blocks Space    Cnt   Len      Size Last_Analyzed           Blocks    Blocks Stats

———- ——— —— —— —– —— —– ——— ——————– ——— ——— ——

blueone           10000    236    148  1940      0   125         0 03/08/26-16:12:11            0         0 NO

PT              7519    189     67  2273   1557   129      7519 03/08/26-16:12:10

PZ              2481     47     81   934    619   113      2481 03/08/26-16:12:11

*/

drop table blueone;

— recreate blueone

declare BEGIN dbms_stats.gather_table_stats(ownname=>USER, tabname=>’blueone’ ); END;

/

                                                                                          Avg_

                                                 Avg_                                   Space_      Num_

                Num_        Empty_  Avg_ Chain_  Row_   Sample_                      Freelist_ Freelist_ Global

Table_Name      Rows Blocks Blocks Space    Cnt   Len      Size Last_Analyzed           Blocks    Blocks Stats

———- ——— —— —— —– —— —– ——— ——————– ——— ——— ——

blueone           10000    236      0     0      0   120     10000 03/08/26-16:20:07            0         0 YES

PT              7519    189      0     0      0   124      7519 03/08/26-16:20:06

PZ              2481     47      0     0      0   107      2481 03/08/26-16:20:06

analyze table blueone delete statistics;

<차이점>

                  NUM_ROWS     BLOCKS EMPTY_BLOCKS  AVG_SPACE  CHAIN_CNT AVG_ROW_LEN SAMPLE_SIZE LAST_ANALYZED

                ———- ———- ———— ———- ———- ———– ———– —————–

ANALYZE              27263        512            0        642       4444         127       27263 03/08/26-15:55:32

DBMS_STATS           27263        512            0          0          0         123       27263 03/08/26-15:56:13

By haisins

오라클 DBA 박용석 입니다. haisins@gmail.com 으로 문의 주세요.

3 thoughts on “Analyze 와 DBMS_STATS 통계 정보 수집 의 차이”
  1. great post, very informative. I wonder why the other specialists of this sector do not realize this.
    You must continue your writing. I’m confident, you’ve a great readers’
    base already!

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다