2011-09-17 4 views
3

의 일환으로 구체화 된 뷰에 대한 통계를 수집 우리는 사용하는 특정 스키마의 모든 테이블에 대한 통계를 새로 고치려면 다음는 gather_schema_stats

exec dbms_stats.gather_schema_stats(ownname => 'some_schema', estimate_percent => dbms_stats.auto_sample_size, cascade => true, method_opt => 'FOR ALL COLUMNS SIZE AUTO', degree => 12); 

이 있지만, 제로로 우리의 구체화 된 뷰의 행 수를 설정하고있는 구체화 된 뷰에 대한 쿼리에 비효율적 인 쿼리 계획을 발생시키는 원치 않는 부작용 우리는 스키마 통계가 실행 된 후 특정 mview에 대한 테이블 통계를 수집하여이 문제를 해결합니다.

내 질문은 : mview 행 수가 0으로 설정되지 않도록하는 방식으로 gather_schema_stats 매개 변수를 변경할 수 있습니까?

+0

이 질문은 [dba.stackexchange.com] (http://dba.stackexchange.com/)에서 더 잘 질문 할 것입니다. – Codo

답변

3

GATHER_SCHEMA_STATS에는 특정 개체를 제외 할 수 없습니다. GATHER STALE을 사용하여 통계가 오래되었지만 구체화 된보기를 포함 할 수있는 객체에만 통계를 수집 할 수 있습니다. 이 문제를 해결하는 몇 가지 방법

1) LOCK_TABLE_STATS 절차를 사용하여 구체화 된보기의 통계를 잠급니다. 이렇게하면 UNLOCK_TABLE_STATS 프로시 듀어 (materialized view statistics를 주기적으로 새로 고치는 프로세스의 일부로)를 호출 할 때까지 GATHER_SCHEMA_STATS이 해당 오브젝트에 대한 통계를 수집하지 못하게됩니다.

2) 스키마 통계를 수집하기 전에 구체화 된 뷰에 대한 통계를 저장하고 GATHER_SCHEMA_STATS 전화가 다시 구체화 된 뷰 통계를 넣어 완료 한 후 다음 RESTORE_TABLE_STATS를 호출 EXPORT_TABLE_STATS 절차를 사용합니다.

3) GATHER_SCHEMA_STATS을 사용하지 마십시오. 원하는 객체를 제외하는 루프에서 GATHER_TABLE_STATS으로 전화하십시오. 예 :

BEGIN 
    FOR x IN (SELECT * 
       FROM dba_tables 
      WHERE owner = 'SOME_SCHEMA' 
       AND table_name NOT IN (<<list of MVs>>)) 
    LOOP 
    dbms_stats.gather_table_stats(x.owner, x.table_name, ...); 
    END LOOP; 
END; 
+1

많은 감사. 나는 lock_table_stats에 대해 들어 보지 못했다. 그것은 mview 통계를 재설정하고 있던 gather_schema_stats가 아니라는 것이 밝혀졌습니다. dbms_snapshot.refresh였습니다. 새로 고침하기 전에 mview 통계를 잠글 것입니다. – grenade