Oracle - Analyze

오픈을 맞이하며 배운 것

Posted by Yan on November 18, 2024

인덱스가 이미 잡혀 있음에도 성능이 안 나올 때, Analyze를 실행하는 것이 도움이 되었다. 아무리 인덱스가 생성되어 있어도, 데이터의 형태에 따라 만들어진 통계 정보가 없으면 FULL SCAN 이 발생할 수 있기 때문이다.

Analyze란?

Analyze는 인덱스, 테이블, 클러스터의 통계정보를 생성한다.

  • Analyze가 생성한 통계정보들은 옵티마이저가 비용기준으로 가장 효율적인 실행계획을 계상할 때 사용된다.
  • 각 오브젝트의 구조를 확인할 수 있고, 체인의 생성 여부를 확인할 수 있으므로 시스템의 저장공간 관리를 도와준다.

Analyze가 데이터 사전에 저장하는 통계 정보들

  • 테이블
    • 총 로우의 수, 총 블럭의 수, 비어있는 블럭에 쓰여질 수 있는 빈 공간의 평균, 체인이 발생된 로우의 수, 로우의 평균 길이
  • 인덱스
    • 인덱스의 depth
    • leaf block의 수
    • Distinct Key의 수
    • Leaf Blocks/Key의 평균
    • Data Blocks/key의 평균
    • Clustering factor
    • 가장 큰 key값, 가장 작은 key값
  • 컬럼: distinct한 값의 수, 히스그램 정보
  • 클러스터: cluster key당 길이의 평균

Analyze 작업 수행시기

  • 주기적으로 수행 시켜주는 것이 좋다(오라클사의 권고는 3개월에 한 번). 테이블을 재생성 하거나, 새로 클러스터링을 한 경우, 인덱스를 추가하거나 재생성한 경우, 다량의 데이터를 SQL이나 배치 애플리케이션을 통해 작업한 경우 Analyze를 수행시켜 주는 것이 좋다.

예시

  1. 테이블 정보 수집
    1
    
    ANALYZE TABLE emp COMPUTE STATISTICS;
    
  2. 특정 컬럼에 대한 data 분포 수집
    1
    
    ANALYZE TABLE emp COMPUTE STATISTICS FOR ALL INDEXED COLUMNS;
    
  3. 통계정보 확인
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    SELECT NUM_ROWS
     , BLOCKS
     , EMPTY_BLOCKS
     , AVG_SPACE
     , CHAIN_CNT
     , AVG_ROW_LEN
     , SAMPLE_SIZE
     , LAST_ANALYED
    FROM USER_TABLES
    WHERE TABLE_NAME = '';
    
1
2
3
4
5
6
7
8
SELECT NUM_DISTINCT
     , DENSITY
     , LOW_VALUE
     , HIGH_VALUE
     , LAST_ANALYZED
     , COLUMN_NAME
  FROM USER_TAB_COL_STATISTICS
 WHERE TABLE_NAME = '';

오라클에서는 테이블과 인덱스에 대한 통계 정보를 생성하기 위해 오라클8까지는 ANALYZE 명령어를 지원하였고, 추후 오라클 8i 부터는 DBMS_STATs 패키지를 제공한다.