태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

불필요한 Histogram만 삭제하기

오라클 2008.12.17 11:40
간혹 원하지 않는 Histogram이 생성되어서 골치아픈 경우가 있다.

이런 경우 자연스럽게 다음과 같은 요구 사항이 생긴다.


다른 통계 정보는 그대로 두고 Histogram만 삭제할 수는 없을까?


Histogram을 없애기 위해 Table 통계 정보를 새로 수집하는 것은 대단히 위험한 선택이 될 수 있다.

DBMS_STATS Package를 잘 사용하면 위험을 최소화하면서 원하는 작업을 수행할 수 있다.

간단한 예제를 통해 방법을 알아 보자.

우선 Table을 만든다.

drop table t1 purge;

create table t1(c1 int, c2 int);

insert into t1
select level, level
from dual
connect by level <= 10000
;


Column c2에 불필요한 Histogram을 강제로 생성한다.

exec dbms_stats.gather_table_stats(user, 't1', -
        method_opt=>'for columns c1 size 1 c2 size 5');

      
통계 정보를 조회해 보면 Height-Balanced Histogram이 생성된 것을 알 수 있다.

@tab_stat t1

-----------------                                
TABLE_NAME                    : T1               
COLUMN_NAME                   : C2               
NUM_DISTINCT                  : 10000            
NUM_NULLS                     : 0                
DENSITY                       : .0001            
LOW_VALUE                     : C102             
HIGH_VALUE                    : C302             
HISTOGRAM                     : HEIGHT BALANCED  
-----------------                                

TABLE_NAME           COLUMN_NAME          ENDPOINT_NUMBER ENDPOINT_VALUE      
-------------------- -------------------- --------------- --------------------
T1                   C1                                 0 1()                 
T1                   C1                                 1 10000()             
T1                   C2                                 0 1()                 
T1                   C2                                 1 2000()              
T1                   C2                                 2 4000()              
T1                   C2                                 3 6000()              
T1                   C2                                 4 8000()              
T1                   C2                                 5 10000()             

Histogram만 없앨 수 없을까?

11g 이저 버전에서는 다음과 같이 DBMS_STATS.SET_COLUMN_STATS를 이용하면 된다.
우선 현재 Column 통계 정보를 저장한 후

col num_distinct new_value v_num_distinct
col density new_value v_density
col num_nulls new_value v_num_nulls
col avg_col_len new_value v_avg_col_len

select num_distinct, density, num_nulls, avg_col_len
from user_tab_col_statistics
where table_name = 'T1' and column_name = 'C2'
;
NUM_DISTINCT    DENSITY  NUM_NULLS AVG_COL_LEN  
------------ ---------- ---------- -----------  
       10000      .0001          0           4  


SET_COLUMN_STATS를 이용해 Histogram이 존재하지 않는 것처럼 저장하는 것이다.

exec dbms_stats.set_column_stats(user, 't1', 'c2', -
        distcnt => &v_num_distinct, -
        density => &v_density, -
        nullcnt => &v_num_nulls, -
        avgclen => &v_avg_col_len);

통계 정보를 조회해 보면 Histogram이 사라진 것을 알 수 있다.

@tab_stat t1       
 -----------------                     
TABLE_NAME                    : T1   
COLUMN_NAME                   : C2   
NUM_DISTINCT                  : 10000
NUM_NULLS                     : 0    
DENSITY                       : .0001
LOW_VALUE                     : C102 
HIGH_VALUE                    : C302 
HISTOGRAM                     : NONE 
-----------------                    

    
Oracle 11g부터는 DELETE_COLUMN_STATS 프로시저에 새롭게 추가된 col_stat_type 파라미터를 이용하면 매우 손쉽게 Histogram을 제거할 수 있다.

호출 방법은 다음과 같다.

exec dbms_stats.delete_column_stats(user, 't1', 'c2', col_stat_type=>'HISTOGRAM');

@tab_stat t1
-----------------                      
TABLE_NAME                    : T1     
COLUMN_NAME                   : C2     
NUM_DISTINCT                  : 10000  
NUM_NULLS                     : 0      
DENSITY                       : .0001  
LOW_VALUE                     : C102   
HIGH_VALUE                    : C302   
HISTOGRAM                     : NONE   
-----------------                      


역시 새로운 버전을 사용함으로써 누릴 수 있는 혜택 중 하나라고 하겠다.

PS)
Histogram이 불필요할 거 같은 Column에 Histogram이 생성되는 경우가 있다.

Oracle은 Density가 매우 낮은, 즉 거의 Unique한 Column이라도 Skewness가 존재한다고 판단되면 Histogram을 수집하기 때문이다.

METHOD_OPT 파라미터의 기본값이 'FOR ALL COLUMN SIZE AUTO'이기 때문에 이런 일이 발생한다.




신고
tags :
Trackbacks 3 : Comment 1
  1. bosoa 2012.05.22 17:32 Modify/Delete Reply

    관리자의 승인을 기다리고 있는 댓글입니다

Write a comment

티스토리 툴바