Analyze
목적
- Serial Statistics Gathering
- 옵티마이저가 가장 효율적인 실행 계획을 수립하기 위한 계산에 사용
- 각 오브젝트의 구조 및 체인 생성 여부를 확인함으로서 시스템 관리에 사용
생성하는 정보
| 오브젝트 | 항목 |
|---|---|
| 테이블 | 전체 레코드 수 전체 Block 수 Block에서 사용 가능한 빈 공간의 평균 체인이 발생된 레코드 수 레코드 평균 길이 |
| 인덱스 | 인덱스 깊이 (Depth) Leaf Block 수 Distinct Key 수 Leaf Blocks/Key의 평균 Data Blocks/Key의 평균 Clustering Factor 가장 큰 Key 값 가장 작은 Key 값 |
| 컬럼 | Distinct 수 히스토그램 정보 |
| 클러스터 | 각 클러스터 Key 길이 평균 |
사용
ANALYZE object_type owner_name.object_name operation_name STATISTICS;
--특정 컬럼
ANALYZE TABLE owner_name.table_name operation_name STATISTICS FOR COLUMNS column_name;
--유효성 검사
ANALYZE object_type owner_name.object_name VALIDATE STRUCTURE;
옵션에 들어갈 값
| 옵션 표기 | 값 | 설명 |
|---|---|---|
| object_type | TABLE | 테이블 이름 |
| object_type | INDEX | 인덱스 이름 |
| object_type | CLUSTER | 클러스터 이름 |
| operation_name | COMPUTE | 통계 정보를 정확하게 계산함 |
| operation_name | ESTIMATE | 딕셔너리 값과 데이터 견본을 가지고 검사하여 통계 정보를 추정함 |
| operation_name | DELETE | 통계 정보를 삭제 |
참고
- 정기적인 ANALYZE가 필요
- 테이블 재생성 및 새로 클러스터링한 경우
- 인덱스 추가 및 재생성한 경우
- 대량의 데이터를 처리한 경우
USER_TABLES,USER_COLUMNS,USER_INDEXS,USER_CLUSTER등의 딕셔너리 관련된 항목들도 ANALYZE를 해주면 좋음- 2만 레코드를 기준으로 작다면
COMPUTE, 많다면ESTIMATE사용을 권장 - CBO, RBO
- DBMS_STATS과의 차이
- ORA-38029: object statistics are locked 에러가 발생할 경우
SQL
--테이블 간단 통계 정보 조회
SELECT OWNER, TABLE_NAME, NUM_ROWS, CHAIN_CNT, BLOCKS, EMPTY_BLOCKS, AVG_SPACE, AVG_ROW_LEN
FROM ALL_TABLES
WHERE OWNER = 'owner_name' AND TABLE_NAME = 'table_name';
--인덱스 간단 통계 정보 조회
SELECT OWNER, INDEX_NAME, TABLE_NAME, STATUS, NUM_ROWS, LEAF_BLOCKS, BLEVEL
FROM ALL_INDEXES
WHERE OWNER = 'owner_name' AND index_name = 'index_name';
--테이블 ANALYZE SQL
SELECT
'ANALYZE TABLE ' || owner || '.' || table_name ||
CASE
WHEN NUM_ROWS >= 20000
THEN ' ESTIMATE '
ELSE ' COMPUTE '
END ||
'STATISTICS;'
FROM ALL_TABLES
WHERE OWNER = 'owner_name';
--인덱스 ANALYZE SQL
SELECT
'ANALYZE INDEX ' || owner || '.' || index_name ||
CASE
WHEN NUM_ROWS >= 20000
THEN ' ESTIMATE '
ELSE ' COMPUTE '
END ||
'STATISTICS;'
FROM ALL_INDEXES
WHERE OWNER = 'owner_name';