ORACLE/ADMIN2015. 5. 9. 18:08
반응형

출처 : http://jhroom.co.kr/12050

통계 정보 생성 Procedure GATHER_TABLE_STATS

 

[  참고 ]
 1. 메뉴얼 [ GATHER_TABLE_STATS ] 
 http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_stats.htm#i1036461
 2. OPTIMIZER INVALIDATION PERIOD
 http://wiki.ex-em.com/index.php/OPTIMIZER_INVALIDATION_PERIOD

 

A.GATHER_TABLE_STATS Procedure

 

1. 개요

: Table,Column,  그리고 index 에 대한 통계 정보를 수집 하게 하는Procedure

 

2. Syntax

:DBMS_STATS.GATHER_TABLE_STATS (<?xml:namespace prefix = o /><?xml:namespace prefix = o />

   Ownname VARCHAR2,

   Tabname  VARCHAR2,

   Partname  VARCHAR2 DEFAULT NULL,

   Estimate_percent NUMBER DEFAULTto_estimate_percent_type

                                              (get_param(‘ESTIMATE_PERCENT’)),

   block_sample BOOLEAN DEFAULT FALSE,

   method_opt  VARCHAR2 DEFAULT get_param(‘METHOD_OPT’),

   degree       NUMBER DEFAULT to_degree_type(get_param(‘DEGREE’)),

   granularity     VARCHAR2 DEFAULT GET_PARAM(‘GRANULARITY’),

   cascade      BOOLEAN DEFAULT to_cascade_type(get_param(‘CASCADE’))

   stattab         VARCHAR2 DEFAULT NULL,

   statid          VARCHAR2 DEFAULT NULL,

  statown        VARCHAR2 DEFAULTNULL,

   no_invalidate   BOOLEAN DEFAULT

to_no_invalidate_type(get_param(‘NO_INVALIDATE’)),

   force           BOOLEAN DEFAULT FALSE );

 

3. Parameter 설명

: dbms_stats.set_param 에 의해서 디폴트 파라미터 설정 변경이 가능하다.

  [ 가능한 값은 
   CASCADE,  DEGREE,  ESTIMATE_PERCENT,  METHOD_OPT,  NO_INVALIDATE,   GRANULARITY,

   ==> 이상은 수동 통계정보 생성 시에 저정을 하지 않았을 때 적용되는 Default 값에 영향을 미치고

   AUTOSTATS_TARGET [ AUTO - Oracle이 자동으로 대상 Object 결정
                                      ALL - 대상 시스템의 모든 Objects
                                      ORACLE - SYS/SYSTEM OBJECT 만 ]

   ==> 자동 통계정보(GATHER_STATS_JOB) 시에만 영향을 미친다.

 

Default 값 확인

SYS>select dbms_stats.get_param('method_opt') from dual ;

DBMS_STATS.GET_PARAM('METHOD_OPT')
--------------------------------------------------------------------------------
FOR ALL COLUMNS SIZE AUTO

 

Default 값 변경

SYS>execute dbms_stats.set_param('method_opt','FOR ALL COLUMNS SIZE 1') ;

PL/SQL procedure successfully completed.

 

변경된 Default 값 확인

SYS>select dbms_stats.get_param('method_opt') from dual ;

DBMS_STATS.GET_PARAM('METHOD_OPT')
--------------------------------------------------------------------------------
FOR ALL COLUMNS SIZE 1

 

Parameter

Description

Ownname

분석할 테이블 소유자

tabname

테이블 이름

partname

파티션 이름지정 하지 않으면 NULL 

Estimate_percent

분석할 Row Percentage, NULL 이면 Compute(Row 전체)
유효값은 1/1000000 ~ 100

디폴트로, DBMS_STATS.AUTO_SAMPLE_SIZE 에 의해서 최적의 값을 결정

Block_sample

random block sampling or random row sampling 결정

random block sampling 이 좀더 효과적이다.

데이터의 블록 별 분포도가 안좋을 시에는 부적절한 정보 생성

디폴트 값이 False, random row sampling 을 수행한다.

Method_opt

Histogram 생성시 사용하는 옵션

l        FOR ALL [ INDEXED | HIDDEN ] COLUMNS [ size_clause ]

l        FOR COLUMN [ size clause ] column | attribute [size clause]

                  [, column|attribute [ size clause ]…]

 Size_clause := SIZE { integer | REPEAT | AUTO | SKEWONLY }

n        Integer : Histogram Bucket , Max  1,254

n        REPEAT : 이미 Histogram 이 있는 칼럼에 대해서만 생성

n         AUTO : 데이터 분산도와 칼럼 부하 정도에 따라서 생성 결정

n         SKEWONLY : 데이터 분산도에 따라서 생성 결정

디폴트 값은 FOR ALL COLUMNS SIZE AUTO 이다.

즉, Histogram 의 생성여부를 Oracle 이 알아서 판단하게 된다.

이 경우

EX) method_opt => FOR ALL COLUMNS SIZE 1

    모든 컬럼에 대해서 Histogram bucket 의 수를 1로 한다.

    컬럼 내에 존재하는 여러 가지 값들의 cardinality 는 모두 동일한

     값으로 간주한다. ( histogram 을 사용하지 않는다.)

     이것은 where 조건에 들어오는 특정 컬럼에 대한 값의 변화에 따라서

      PLAN 이 변경될 가능성을 없애고자 함이다.

FOR ALL COLUMNS SIZE 1 로 설정하여 Histogram 정보가 생성되지

않도록 조치 한다.

degree

병렬처리 정도

디폴트 값은 NULL 이고, CREATE TABLE, ALTER TABLE 

설정된 DEGREE 값에 의해 정해진다.

AUTO_DEGREE 값은 병렬처리 정도를 자동으로 결정한다.

이것은 1 or DEFAULT_DEGREE [ Object Size  CPU Count 에 의해 결정 ]

granularity

Parition table 에 대한 분석시 사용

‘ALL’ – Global, Partition, Subpartition 통계정보 수집 – Parition Table 대상

‘AUTO’ – 디폴트 값으로 ,Partition Type 에 따라서 결정 – 일반 Table 대상

‘DEFAULT’ – Global, Partition 통계정보 수집, Old Version 과 호환을 위해 사용

‘GLOBAL’ -  Global 통계정보 수집

‘GLOBAL AND PARTITION’ – SubPartition 에 대한 통계정보는 수집되지 않는다.

‘PARTITION’ – Partition 통계정보 수집

‘SUBPARTITION’ – SubPartition 통계정보 수집

cascade

대상 테이블의 인덱스에 대한 통계수집 여부

인덱스 통계정보는 병렬처리가 불가능하다.

TRUE – 대상 테이블에 관련된 index 에 대해서 통계정보 수집

stattab

통계수집을 통한 기존 통계정보 Update 전에,

기존에 존재하는 통계정보를 저장할 User Stat Table 을 지정

statid

Stattab 와 연관된 구분자 값

statown

Stattab 에 지정한 User Stat Table 의 소유자가 다를 경우 지정

no_invalidate

의존적인 Cursor Invalidate 할지 , 안할지 결정

True –   관련된 Cursor  invalidate 하지 않는다.

False – 관련된 Cursor  Invalidate 한다.

Default 로 DBMS_STATS.AUTO_INVALIDATE 값이고,

의미는 DBMS 가 의존적 Cursor 를  언제 invalidate 할지 자동으로 결정

이때 작용하는 Parameter는 _OPTIMIZER_INVALIDATION_PERIOD 이고,

Default 롤 18000 초(5시간) 이다.

 즉, 통계 정보 수집에 의해 통계 정보가 변경된 후 약 5시간에 걸쳐 랜덤한 시점에  해당 Cursor가 실행될 때 invalidation이 발생한다.

이것을 Auto Invalidation이라고 부른다. 
일정 시간에 걸쳐 랜덤하게 Cursor를 Invalidation함으로써 특정 시점에

Hard Parse가  한꺼번에 몰리는 현상을 피할 수 있다.

2011/03/30

_OPTIMIZER_INVALIDATION_PERIOD 파라미터로 시간 조절 가능

force

Lock 걸린 Table 에 대해서도 강제로 통계정보 생성

 

 

예제 ) 참조– 메타링크 (일반 테이블- 237537.1, 파티션 테이블 - 237538.1 )

Cascade => TRUE

è 인덱스에 대한 통계정보도수집하라.

Cascade => FALSE

è 인덱스에 대한 통계정보도수집하라.

method_opt =>'FOR ALL COLUMNS SIZE 1'

 è 칼럼(High and Low Column Value)에 대한 통계정보도 수집하라.

method_opt =>'FOR COLUMNS'

 è 컬럼에 대한통계정보를 수집하지 마라

 

 ) 일반 테이블

SQL> show user

USER is"SYS"

1.  SCOTT BIG_TABLE 의 전체 테이블과 모드 인덱스를 가지고,

테이블칼럼(Highand Low Column Value)연관 인덱스

통계정보를 생성한다.( COMPUTE STATISTICS )

SQL> execdbms_stats.gather_table_stats(ownname => 'SCOTT',

tabname => 'BIG_TABLE', cascade =>TRUE,

method_opt => 'FOR ALL COLUMNS SIZE 1');

PL/SQL proceduresuccessfully completed.

 

2.      SCOTT  BIG_TABLE 15% Row 를 가지고,

테이블칼럼연관인덱스의

통계정보를 생성한다. ( SAMPLE 15 PERCENT )

 

SQL> execdbms_stats.gather_table_stats(ownname => 'SCOTT',

 tabname=> 'BIG_TABLE', cascade => TRUE, estimate_percent => 15) ;

 

PL/SQL proceduresuccessfully completed.

 

3.  SCOTT  BIG_TABLE 의 의 전체 테이블과 모드 인덱스를 가지고,

테이블의통계정보를 수집하라인덱스와 칼럼에 대한 통계정보는 제외

 

SQL> execdbms_stats.gather_table_stats(ownname => 'SCOTT',

 tabname=> 'BIG_TABLE', cascade => FALSE, method_opt => 'FOR COLUMNS');

 

PL/SQL proceduresuccessfully completed.

 

4.  SCOTT  BIG_TABLE 의 전체 테이블과 모드 인덱스를 가지고,

테이블과인덱스에 대한 통계정보를 수집하라칼럼에 대한 통계정보는 제외

 

SQL> execdbms_stats.gather_table_stats(ownname => 'SCOTT',

tabname => 'BIG_TABLE', cascade  => TRUE, method_opt =>'FOR COLUMNS');

 

PL/SQL proceduresuccessfully completed.

 

5.    SCOTT  BIG_TABLE 의 전체 테이블과 모드 인덱스를 가지고,

테이블과칼럼(No Histogram) 그리고 인덱스에 대한 통계정보를 수집하라.

잠시 후에

인덱스 칼럼들의 Histogram 통계정보를 수집하라.

SQL> execdbms_stats.gather_table_stats(ownname => 'SCOTT',

tabname => 'BIG_TABLE', cascade => TRUE) ;

PL/SQL proceduresuccessfully completed.

잠시 후에..

SQL> exec  dbms_stats.gather_table_stats(ownname =>'SCOTT',

            tabname => 'BIG_TABLE', cascade=> TRUE,

method_opt => 'FOR ALL INDEXED COLUMNSSIZE 1');

PL/SQL proceduresuccessfully completed.

 

6. SCOTT  BIG_TABLE 의 전체 테이블과 모드 인덱스를 가지고,

   테이블과 인덱스칼럼(Only High and Low )에 대한 통계정보를 수집하라

   인덱스에 대한 통계정보는수집하지 마라.

 

SQL> execdbms_stats.gather_table_stats(ownname => 'SCOTT',

tabname => 'BIG_TABLE', cascade =>FALSE,

method_opt => 'FOR ALL INDEXED COLUMNSSIZE 1');

 

PL/SQL proceduresuccessfully completed.

 


나.) PartitionTable 의 경우

    추가적으로 granularity 정보를 ‘ALL’,’AUTO’,’PARITION’,

’GLOBAL AND PARTITION,’GLOBAL’,’SUBPARTITION’을 통해서

통계수집 대상 Table Segment 를 선정 가능하다.



참고 ] LOCK VS DBMS_STATS.GATHER_TABLE_STATS
        : DML 이 LOCK 이 발생 하여도 GATHER_TABLE_STATS 는 정상적으로 진행된다.
 SCOTT10> begin
    for i in 1001 .. 5000 loop
    insert into check_lock values ( i , i , 'lock');
    end loop ;
    end ;
     / 
 PL/SQL procedure successfully completed.

 SYS>@check_user_lock.sql
 Enter value for user_name: scott10
 old  46: and b.username =upper('&USER_NAME')
 new  46: and b.username =upper('scott10')

 USERNAME    SID LOCK_TYPE       MODE_HELD   MODE_REQUE LOCK_ID1 LOCK_ID2
 ---------- ---- --------------- ----------- ---------- -------- --------
 SCOTT10     151 DML             Row-X (SX)  None       51782    0
 SCOTT10     151 Transaction     Exclusive   None       131077   307


 SYS>execute dbms_stats.gather_table_stats(ownname =>'SCOTT10',tabname => 'CHECK_LOCK');
 PL/SQL procedure successfully completed.
 ==> DML LOCK 과는 무관하게 진행 된다.


반응형
Posted by [PineTree]
ORACLE/ADMIN2013. 3. 4. 16:10
반응형

0g SYSAUX tablespace 크기 줄이기
오라클 2009/01/14 16:42
sysaux tablespace는 10g에서 새로 추가된 system default tablespace의 하나로 기존에 system tablespace에
저장되던 각종 ORACLE OPTION들의 schema가 저장되며 10g의 new feature인 AWR(auto workload repository) 데이터들이 저장되는 tablespace 입니다.
 
awr정보는 default로 1시간에 한번씩 data를 gathering하고 그 정보를 7일동안 저장하게 되어 있습니다.
7일이 지나면 가장 오래된 awr정보를 자동으로 삭제하게끔 되어 있습니다.
awr정보는 7일간 저장되지만 주기적으로 실행하는 table analyze 정보는 default로 31일 동안 저장이 됩니다.

<해결책>

1. select dbms_stats.get_stats_history_retention from dual;
(기본 31일입니다.)

2. exec dbms_stats.alter_stats_history_retention(7);
=> 일주일 주기로 바꿈
 
3.exec dbms_stats.purge_stats(to_timestamp_tz('10-10-2008 00:00:00 Asia/Seoul','DD-MM-YYYY HH24:MI:SS TZR'));
=> AWR(auto workload repository) 데이터 저장 값입니다. 디폴드 주기 31일 이지만
2008년 10월10일 이전 데이터 삭제 => 날짜 조정 해주시면 됩니다.
oracle 사용 내부 통계 정보로 자동 삭제 주기를 줄인 다음 값을 삭제 하는겁니다.

4.alter table wri$_optstat_histgrm_history enable row movement;

5.alter table wri$_optstat_histgrm_history shrink space;
5번 실행 해서 에러 없을 경우 진행
SQL> alter table wri$_optstat_histgrm_history shrink space;
alter table wri$_optstat_histgrm_history shrink space
*
1행에 오류:
ORA-10631: SHRINK clause should not be specified for this object
=> 에러 날 경우 6번 진행

6. 5번에서 에러 날 경우[index 생성 쿼리 추출 구문 실행]
set long 1000
select dbms_metadata.get_ddl('INDEX','I_WRI$_OPTSTAT_H_OBJ#_ICOL#_ST','SYS') from dual;

=>결과
CREATE INDEX "SYS"."I_WRI$_OPTSTAT_H_OBJ#_ICOL#_ST"
ON "SYS"."WRI$_OPTSTAT_HISTGRM_HISTORY"("OBJ#","INTCOL#",SYS_EXTRACT_UTC("SAVTIME"))
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "SYSAUX" nologging;


select dbms_metadata.get_ddl('INDEX','I_WRI$_OPTSTAT_H_ST','SYS') from dual;

=> 결과
 CREATE INDEX "SYS"."I_WRI$_OPTSTAT_H_ST"
 ON "SYS"."WRI$_OPTSTAT_HISTGRM_HISTORY"(SYS_EXTRACT_UTC("SAVTIME")) PCTFREE 10 INITRANS 2 MAXTRANS 255
 COMPUTE STATISTICS STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1
 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "SYSAUX" nologging;

7. INDEX 삭제 아래 적용 후 재 생성
drop INDEX "SYS"."I_WRI$_OPTSTAT_H_OBJ#_ICOL#_ST";

drop INDEX "SYS"."I_WRI$_OPTSTAT_H_ST";
=============================================

8. alter table WRI$_OPTSTAT_HISTGRM_HISTORY enable row movement;

9. alter table WRI$_OPTSTAT_HISTGRM_HISTORY shrink space;

10. alter table WRI$_OPTSTAT_HISTGRM_HISTORY disable row movement;

11. alter session set workarea_size_policy=manual;

12. alter session set sort_area_size=104857600;

13. 위에서 삭제한 index 생성 쿼리 실행
13-1.
CREATE INDEX "SYS"."I_WRI$_OPTSTAT_H_ST"
 ON "SYS"."WRI$_OPTSTAT_HISTGRM_HISTORY"(SYS_EXTRACT_UTC("SAVTIME")) PCTFREE 10 INITRANS 2 MAXTRANS 255
 COMPUTE STATISTICS STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1
 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "SYSAUX" nologging;
13-2.
CREATE INDEX "SYS"."I_WRI$_OPTSTAT_H_OBJ#_ICOL#_ST"
ON "SYS"."WRI$_OPTSTAT_HISTGRM_HISTORY"("OBJ#","INTCOL#",SYS_EXTRACT_UTC("SAVTIME"))
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "SYSAUX" nologging;

14.결과 조회
14-1
select occupant_name,space_usage_kbytes/1024 "MB"
from v$sysaux_occupants
order by space_usage_kbytes
/
적용 전
OCCUPANT_NAME                                         MB
--------------------------------------------- ----------

SM/OPTSTAT                                        4.8125
SM/AWR
적용 후

SM/OPTSTAT                                           3.5
SM/AWR

15. SYSAUX Tablespace 사용량 체크

select tablespace_name,sum(bytes/1024/1024) "Free(M)"
from dba_free_space
where tablespace_name = 'SYSAUX'
group by tablespace_name;

반응형
Posted by [PineTree]
ORACLE/ADMIN2010. 11. 23. 18:12
반응형

-Analyze는 Serial Statistics Gathering 기능만 있는 반면, dbms_stats는 Parallel Gathering기능이있다.

-Analyze는 파티션의 통계정보를 각 파티션 테이블과 인덱스에 대해서 수집하고,

Golbal Statistics는 파티션 정보를 가지고 계산하므로, 부정확할 수 있다.

그러므로 파티션 또는 서브파티션이 있는 객체에는 DBMS_STATS을 사용 하여야 한다.

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

-DBMS_STATS는 CBO와 관련된 통계정보만을 수집한다.

즉, 테이블의EMPTY_BLOCKS, AVG_SPACE, CHAIN_CNT 등은 수집되지 않는다.

-DBMS_STATS는 사용자가 지정한 통계정보 테이블에 수집된 통계정보를 저장할수있고,

딕셔너리로 각 컬럼, 테이블, 인덱스, 스키마등을 반영 할 수 있다.

-DBMS_STATS는 IMPORT/EXPORT 기능 및 추가적인 기능이 많다.

이 기능을 이용하여 운영 DB의 통계정보를 개발장비의 통계정보로

복사할 수 있으므로 개발장비의 팰린을 운영장비와 같게 만들 수 있다.(메뉴얼 참조)

 

Optimizer statistics 생성은 시간과 자원이 많이 드는 작업입니다.

Optimizer를 지원하기 위한 통계 생성 작업에서 Optimizer가 Cost 계산에 고려하지 않는

정보를 만들기 위해서 시간과 자언을 사용할 필요는 없을 것입니다.

 

그래서 아래 내용이 피룡하다면 여전히 analyze 명령을 사용해야 합니다.

 

ANALYZE 명령

 

analyze 명령은 DBMS_STATS 패키지를 사용하기 전에 사용했던 명령으로, 유사한 통계자료를 수집하는데

사용된다. DBMS_STATS 패키지가 통계 자료 수집에 더 우수하기 때문에 오라클은 패키지의 사용을 권장하지만,

DBMS_STATS 패키지로 수ㅡ집할 수 없는 통계 자료는 다음과 같습니다.

 

- VALIDATE 또는 LIST CHAINED ROWS 절의 사용

- 통계 자료 예측시 행의 샘플 개수

- 프리리스트 블록 관련 정보와 같은 옵티마이저에 의해 사용되지 않는 통계 자료 수집.

 

SQL> ANALYZE TABLE table_name VALIDATE STRUCTURE;

 

test방법

 

1세션과 2세션으로 구분하여 test하면된다.

 

 1 session t1 analyze

 2 session t2 dbms_stats

SQL> create table t1 (c1 number, c2 varchar2(10), c3 varchar2(10));

테이블이 생성되었습니다.

SQL> exec p('select * from user_tables where table_name = ''T1'' ')
---------------------------------------------------
TABLE_NAME                    : T1
TABLESPACE_NAME               : SYSTEM
CLUSTER_NAME                  :
IOT_NAME                      :
STATUS                        : VALID
PCT_FREE                      : 10
PCT_USED                      : 40
INI_TRANS                     : 1
MAX_TRANS                     : 255
INITIAL_EXTENT                : 65536
NEXT_EXTENT                   :
MIN_EXTENTS                   : 1
MAX_EXTENTS                   : 2147483645
PCT_INCREASE                  :
FREELISTS                     : 1
FREELIST_GROUPS               : 1
LOGGING                       : YES
BACKED_UP                     : N
NUM_ROWS                      :
BLOCKS                        :
EMPTY_BLOCKS                  :
AVG_SPACE                     :
CHAIN_CNT                     :
AVG_ROW_LEN                   :
AVG_SPACE_FREELIST_BLOCKS     :
NUM_FREELIST_BLOCKS           :
DEGREE                        :          1
INSTANCES                     :          1
CACHE                         :     N
TABLE_LOCK                    : ENABLED
SAMPLE_SIZE                   :
LAST_ANALYZED                 :
PARTITIONED                   : NO
IOT_TYPE                      :
TEMPORARY                     : N
SECONDARY                     : N
NESTED                        : NO
BUFFER_POOL                   : DEFAULT
ROW_MOVEMENT                  : DISABLED
GLOBAL_STATS                  : NO
USER_STATS                    : NO
DURATION                      :
SKIP_CORRUPT                  : DISABLED
MONITORING                    : YES
CLUSTER_OWNER                 :
DEPENDENCIES                  : DISABLED
COMPRESSION                   : DISABLED
DROPPED                       : NO
---------------------------------------------------

PL/SQL procedure successfully completed.
SQL> analyze table t1 compute statistics;

Table analyzed.

SQL> exec p('select * from user_tables where table_name = ''T1'' ')
---------------------------------------------------
TABLE_NAME                    : T1
TABLESPACE_NAME               : SYSTEM
CLUSTER_NAME                  :
IOT_NAME                      :
STATUS                        : VALID
PCT_FREE                      : 10
PCT_USED                      : 40
INI_TRANS                     : 1
MAX_TRANS                     : 255
INITIAL_EXTENT                : 65536
NEXT_EXTENT                   :
MIN_EXTENTS                   : 1
MAX_EXTENTS                   : 2147483645
PCT_INCREASE                  :
FREELISTS                     : 1
FREELIST_GROUPS               : 1
LOGGING                       : YES
BACKED_UP                     : N
NUM_ROWS                      : 0
BLOCKS                        : 0
EMPTY_BLOCKS                  : 7
AVG_SPACE                     : 0
CHAIN_CNT                     : 0
AVG_ROW_LEN                   : 0
AVG_SPACE_FREELIST_BLOCKS     : 0
NUM_FREELIST_BLOCKS           : 0
DEGREE                        :          1
INSTANCES                     :          1
CACHE                         :     N
TABLE_LOCK                    : ENABLED
SAMPLE_SIZE                   : 0
LAST_ANALYZED                 : 23-NOV-2010 16:27:57
PARTITIONED                   : NO
IOT_TYPE                      :
TEMPORARY                     : N
SECONDARY                     : N
NESTED                        : NO
BUFFER_POOL                   : DEFAULT
ROW_MOVEMENT                  : DISABLED
GLOBAL_STATS                  : NO
USER_STATS                    : NO
DURATION                      :
SKIP_CORRUPT                  : DISABLED
MONITORING                    : YES
CLUSTER_OWNER                 :
DEPENDENCIES                  : DISABLED
COMPRESSION                   : DISABLED
DROPPED                       : NO
---------------------------------------------------

 

PL/SQL procedure successfully completed.

SQL> insert into t1 select level, 'test1', 'test2' from dual connect by level <= 1000;

1000 rows created.
SQL> analyze table t1 compute statistics;

Table analyzed.

SQL> exec p('select * from user_tables where table_name = ''T1'' ')
---------------------------------------------------
TABLE_NAME                    : T1
TABLESPACE_NAME               : SYSTEM
CLUSTER_NAME                  :
IOT_NAME                      :
STATUS                        : VALID
PCT_FREE                      : 10
PCT_USED                      : 40
INI_TRANS                     : 1
MAX_TRANS                     : 255
INITIAL_EXTENT                : 65536
NEXT_EXTENT                   :
MIN_EXTENTS                   : 1
MAX_EXTENTS                   : 2147483645
PCT_INCREASE                  :
FREELISTS                     : 1
FREELIST_GROUPS               : 1
LOGGING                       : YES
BACKED_UP                     : N
NUM_ROWS                      : 1000
BLOCKS                        : 3
EMPTY_BLOCKS                  : 4
AVG_SPACE                     : 1114
CHAIN_CNT                     : 0
AVG_ROW_LEN                   : 19
AVG_SPACE_FREELIST_BLOCKS     : 1698
NUM_FREELIST_BLOCKS           : 1
DEGREE                        :          1
INSTANCES                     :          1
CACHE                         :     N
TABLE_LOCK                    : ENABLED
SAMPLE_SIZE                   : 1000
LAST_ANALYZED                 : 23-NOV-2010 16:30:07
PARTITIONED                   : NO
IOT_TYPE                      :
TEMPORARY                     : N
SECONDARY                     : N
NESTED                        : NO
BUFFER_POOL                   : DEFAULT
ROW_MOVEMENT                  : DISABLED
GLOBAL_STATS                  : NO
USER_STATS                    : NO
DURATION                      :
SKIP_CORRUPT                  : DISABLED
MONITORING                    : YES
CLUSTER_OWNER                 :
DEPENDENCIES                  : DISABLED
COMPRESSION                   : DISABLED
DROPPED                       : NO
---------------------------------------------------

PL/SQL procedure successfully completed.

 SQL> create table t2(c1 number, c2 varchar2(10), c3 varchar2(10));

Table created.

SQL> exec p('select * from user_tables where table_name = ''T2'' ')
---------------------------------------------------
TABLE_NAME                    : T2
TABLESPACE_NAME               : SYSTEM
CLUSTER_NAME                  :
IOT_NAME                      :
STATUS                        : VALID
PCT_FREE                      : 10
PCT_USED                      : 40
INI_TRANS                     : 1
MAX_TRANS                     : 255
INITIAL_EXTENT                : 65536
NEXT_EXTENT                   :
MIN_EXTENTS                   : 1
MAX_EXTENTS                   : 2147483645
PCT_INCREASE                  :
FREELISTS                     : 1
FREELIST_GROUPS               : 1
LOGGING                       : YES
BACKED_UP                     : N
NUM_ROWS                      :
BLOCKS                        :
EMPTY_BLOCKS                  :
AVG_SPACE                     :
CHAIN_CNT                     :
AVG_ROW_LEN                   :
AVG_SPACE_FREELIST_BLOCKS     :
NUM_FREELIST_BLOCKS           :
DEGREE                        :          1
INSTANCES                     :          1
CACHE                         :     N
TABLE_LOCK                    : ENABLED
SAMPLE_SIZE                   :
LAST_ANALYZED                 :
PARTITIONED                   : NO
IOT_TYPE                      :
TEMPORARY                     : N
SECONDARY                     : N
NESTED                        : NO
BUFFER_POOL                   : DEFAULT
ROW_MOVEMENT                  : DISABLED
GLOBAL_STATS                  : NO
USER_STATS                    : NO
DURATION                      :
SKIP_CORRUPT                  : DISABLED
MONITORING                    : YES
CLUSTER_OWNER                 :
DEPENDENCIES                  : DISABLED
COMPRESSION                   : DISABLED
DROPPED                       : NO
---------------------------------------------------


PL/SQL procedure successfully completed.

SQL> exec dbms_stats.gather_table_stats(user,'T2')

PL/SQL procedure successfully completed.

SQL> exec p('select * from user_tables where table_name = ''T2'' ')
---------------------------------------------------
TABLE_NAME                    : T2
TABLESPACE_NAME               : SYSTEM
CLUSTER_NAME                  :
IOT_NAME                      :
STATUS                        : VALID
PCT_FREE                      : 10
PCT_USED                      : 40
INI_TRANS                     : 1
MAX_TRANS                     : 255
INITIAL_EXTENT                : 65536
NEXT_EXTENT                   :
MIN_EXTENTS                   : 1
MAX_EXTENTS                   : 2147483645
PCT_INCREASE                  :
FREELISTS                     : 1
FREELIST_GROUPS               : 1
LOGGING                       : YES
BACKED_UP                     : N
NUM_ROWS                      : 0
BLOCKS                        : 0
EMPTY_BLOCKS                  : 0
AVG_SPACE                     : 0
CHAIN_CNT                     : 0
AVG_ROW_LEN                   : 0
AVG_SPACE_FREELIST_BLOCKS     : 0
NUM_FREELIST_BLOCKS           : 0
DEGREE                        :          1
INSTANCES                     :          1
CACHE                         :     N
TABLE_LOCK                    : ENABLED
SAMPLE_SIZE                   : 0
LAST_ANALYZED                 : 23-NOV-2010 16:28:36
PARTITIONED                   : NO
IOT_TYPE                      :
TEMPORARY                     : N
SECONDARY                     : N
NESTED                        : NO
BUFFER_POOL                   : DEFAULT
ROW_MOVEMENT                  : DISABLED
GLOBAL_STATS                  : YES
USER_STATS                    : NO
DURATION                      :
SKIP_CORRUPT                  : DISABLED
MONITORING                    : YES
CLUSTER_OWNER                 :
DEPENDENCIES                  : DISABLED
COMPRESSION                   : DISABLED
DROPPED                       : NO
---------------------------------------------------

PL/SQL procedure successfully completed.

SQL> insert into t2 select level, 'test1', 'test2' from dual connect by level <= 1000;

1000 rows created.

SQL> exec dbms_stats.gather_table_stats(user,'T2')

PL/SQL procedure successfully completed.

SQL> exec p('select * from user_tables where table_name = ''T2'' ')
---------------------------------------------------
TABLE_NAME                    : T2
TABLESPACE_NAME               : SYSTEM
CLUSTER_NAME                  :
IOT_NAME                      :
STATUS                        : VALID
PCT_FREE                      : 10
PCT_USED                      : 40
INI_TRANS                     : 1
MAX_TRANS                     : 255
INITIAL_EXTENT                : 65536
NEXT_EXTENT                   :
MIN_EXTENTS                   : 1
MAX_EXTENTS                   : 2147483645
PCT_INCREASE                  :
FREELISTS                     : 1
FREELIST_GROUPS               : 1
LOGGING                       : YES
BACKED_UP                     : N
NUM_ROWS                      : 1000
BLOCKS                        : 3
EMPTY_BLOCKS                  : 0
AVG_SPACE                     : 0
CHAIN_CNT                     : 0
AVG_ROW_LEN                   : 15
AVG_SPACE_FREELIST_BLOCKS     : 0
NUM_FREELIST_BLOCKS           : 0
DEGREE                        :          1
INSTANCES                     :          1
CACHE                         :     N
TABLE_LOCK                    : ENABLED
SAMPLE_SIZE                   : 1000
LAST_ANALYZED                 : 23-NOV-2010 16:30:39
PARTITIONED                   : NO
IOT_TYPE                      :
TEMPORARY                     : N
SECONDARY                     : N
NESTED                        : NO
BUFFER_POOL                   : DEFAULT
ROW_MOVEMENT                  : DISABLED
GLOBAL_STATS                  : YES
USER_STATS                    : NO
DURATION                      :
SKIP_CORRUPT                  : DISABLED
MONITORING                    : YES
CLUSTER_OWNER                 :
DEPENDENCIES                  : DISABLED
COMPRESSION                   : DISABLED
DROPPED                       : NO
---------------------------------------------------

PL/SQL procedure successfully completed.

 

 위 결과와 같이 analyze 와 dbms_stats의 차이는

 EMPTY_BLOCKS, AVG_SPACE, CHAIN_CNT, AVG_SPACE_FREELIST_BLOCKS, NUM_FREELIST_BLOCKS들을

수집하느냐 안하느냐를 볼수있다.

그리고 AVG_ROW_LEN값이 틀려지고 AVG_ROW_LEN yes냐 no의 차이도있다.

 


반응형
Posted by [PineTree]