Patrick's 데이터 세상

ANALYZE 본문

Programming/Oracle

ANALYZE

patrick610 2020. 6. 21. 15:21
반응형
SMALL

개요

 

  지정한 테이블 access에서 Index Scan을 유도하도록  
/*+INDEX(테이블 인덱스명) */ 인덱스 힌트를 부여하였는데 어찌 된 일인지 
실행계획 확인 결과 Index Scan 방식이 실행되지 않고 계속 Full Scan이 실행되면서 쿼리가 실행되지 않는 오류가 발생하였습니다.

ANALYZE TABLE 테이블명 COMPUTE STATISTICS;

실행 이후 정상적으로 Index Scan이 실행되었습니다.

 

 

 

ANALYZE란?

  ANALYZE는 인덱스, 테이블, 클러스터의 통계정보를 생성합니다.
  ANALYZE가 생성한 통계정보들은 비용 기준(Cost-based)의 옵티마이저가 가장 효율적인 실행계획을 수립하기 위해 최소비용을 계산할 때 사용됩니다.
  각 오브젝트의 구조를 확인하는 것과 체인(Chain) 생성 여부를 확인할 수 있으므로 시스템의 저장공간 관리를 도와줍니다.

ANALYZE는 다음과 같은 통계정보를 생성하여 데이터 사전에 저장합니다.

  • 테이블 : 총 로우의 수, 총블록의 수, 비어있는 블럭에 쓰일 수 있는 빈 공간의 평균, 체인이 발생된 로우의 수, 로우의 평균 길이
  • 인덱스 : 인덱스의 깊이(Depth), Leaf block의 개수, Distinct Key의 수, Leaf Blocks/Key의 평균, Data blocks/key의 평균, Clustering Factor, 가장 큰 key 값, 가장 작은 key 값
  • 컬럼 : Distinct 한 값의 수, 히스토그램 정보
  • 클러스터 : Cluster Key당 길이의 평균

 

 

문법

object-clause : TABLE, INDEX, CLUSTER 중에서 해당하는 오브젝트를 기술하고 처리할 오브젝트 명을 기술합니다.

operation : operation 옵션에는 다음 3가지 중 한 가지 기능을 선택할 수 있습니다.

  • COMPUTE : 각각의 값들을 정확하게 계산합니다. 
                    가장 정확한 통계를 얻을 수 있지만 처리 속도가 가장 느립니다.
  • ESTIMATE : 자료 사전의 값과 데이터 견본을 가지고 검사해서 통계를 예상합니다. 
                    COMPUTE보다 덜 정확 하지만 처리속도가 훨씬 빠릅니다.
  • DELETE : 테이블의 모든 통계 정보를 삭제합니다.

 

 

정보수집

- 주기적인 ANALYZE 작업을 수행시켜 주어야 합니다.

- 테이블을 재생성하거나, 새로 클러스터링을 한 경우, 인덱스를 추가하거나 재생성한 경우, 다량의 데이터를 SQL이나 배치 애플리케이션을 통해 작업한 경우 ANALYZE를 수행시켜 주는 것이 좋습니다.

- 사용자는 USER_TABLES, USER_COLUMNS, USER_INDEXS, USER_CLUSTER 등의 자료 사전 뷰를 통해 정보를 확인할 수 있습니다.

- 테이블을 ANALYZE 시킨다면 거기에 따르는 인덱스들도 같이 실시하는 것이 좋습니다.

 

테이블 정보수집 예제

ANALYZE TABLE EMP COMPUTE STATISTICS;


새로운 정보를 구하기 전에 기존 정보를 삭제

ANALYZE TABLE EMP DELETE STATISTICS;


특정 Column에 대한 Data 분포 수집

ANALYZE TABLE EMP COMPUTE STATISTICS FOR ALL INDEXED COLUMNS;


통계 정보 확인 예제

SELECT num_rows
	 , blocks
     , empty_blocks
     , avg_space
     , chain_cnt
     , avg_row_len
     , sample_size, last_analyzed
FROM USER_TABLES
WHERE table_name='CMS_CATEGORY';


SELECT num_distinct
	 , density
     , low_value
     , high_value
     , last_analyzed
     , column_name
FROM USER_TAB_COL_STATISTICS
WHERE table_name='CMS_CATEGORY';

 

 

참고 : http://www.gurubee.net/lecture/1740

반응형
LIST
Comments