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';