인덱스 생성/삭제/리빌드에 대한 통계정보 1 1 8,665

by 타락천사 dbms_stats 인덱스 리빌드 통계정보생성 [2009.11.25 15:14:33]


인덱스 생성 및 Rebuild 시 통계정보 자동 갱신 파라미터
==> _optimizer_compute_index_stats
    디폴트 값이 TRUE 로 인덱스 신규생성이나 리빌드시에 자동으로 통계정보가 갱신된다.

    테이블에 row 가 유/무에 상관없이 항상 동일하게 작동 합니다.

-- 관련 파라미터 체크
-- RUN BY SYS
SELECT
a.ksppinm "Parameter", b.ksppstvl "Session Value", c.ksppstvl "Instance Value"
FROM
x$ksppi a, x$ksppcv b, x$ksppsv c
WHERE a.indx = b.indx
AND   a.indx = c.indx
AND   a.ksppinm LIKE ’%_optimizer_compute_index_stats%’
/

-- 파라미터 의미
-- This parameter means that Optimizer Statistics will be generated
-- on the Indexes during creation or rebuild of these
-- _optimizer_compute_index_stats    TRUE    TRUE  

 

-- TEST 시작

-- 테이블 생성
CREATE TABLE CHECK_INDEX ( A1 NUMBER, A2 VARCHAR2(100), A3 NUMBER ) ;

-- 통계정보 수집
exec dbms_stats.gather_table_stats(ownname => ’OPS$ORACLE’, tabname=> ’CHECK_INDEX’) ;

-- 테이블 통계정보 관련 체크
SELECT OWNER, TABLE_NAME, LAST_ANALYZED FROM DBA_TABLES WHERE TABLE_NAME =’CHECK_INDEX’;
-- OPS$ORACLE    CHECK_INDEX     2009/11/25 15:15:33

-- 인덱스 통계정보 관련 체크 ( 아직 인덱스 만들기 전 ^^;)
SELECT OWNER, INDEX_NAME, LAST_ANALYZED FROM DBA_INDEXES WHERE TABLE_NAME =’CHECK_INDEX’;
-- 값없음

-- 인덱스 생성
CREATE INDEX XAK1_CHECK_INDEX ON CHECK_INDEX ( A1, A2 ) ;

-- 테이블 통계정보 관련 체크
SELECT OWNER, TABLE_NAME, LAST_ANALYZED FROM DBA_TABLES WHERE TABLE_NAME =’CHECK_INDEX’;
-- OPS$ORACLE    CHECK_INDEX     2009/11/25 15:15:33
-- 변경 없음 (인덱스 생성에 따른 테이블 통계정보 갱신 없음 )

-- 인덱스 통계정보 관련 체크
SELECT OWNER, INDEX_NAME, LAST_ANALYZED FROM DBA_INDEXES WHERE TABLE_NAME =’CHECK_INDEX’;
-- OPS$ORACLE    XAK1_CHECK_INDEX    2009/11/25 15:16:40
-- 인덱스 생성과 동시에 인덱스에 대한 통계정보가 생성 된다.

-- 인덱스 리빌드
ALTER  INDEX XAK1_CHECK_INDEX REBUILD ;

-- 테이블 통계정보 관련 체크
SELECT OWNER, TABLE_NAME, LAST_ANALYZED FROM DBA_TABLES WHERE TABLE_NAME =’CHECK_INDEX’;
-- OPS$ORACLE    CHECK_INDEX     2009/11/25 15:15:33
-- 변경 없음

-- 인덱스 통계정보 관련 체크
SELECT OWNER, INDEX_NAME, LAST_ANALYZED FROM DBA_INDEXES WHERE TABLE_NAME =’CHECK_INDEX’;
-- OPS$ORACLE    XAK1_CHECK_INDEX    2009/11/25 15:19:07
-- 인덱스 리빌드와 동시에 인덱스에 대한 통계정보가 생성 된다.

-- 테이블에 대한 통계정보 수집
-- CASCADE = YES 가 디폴트다 - 즉 테이블 통계정보 수집 시에,  인덱스에 대한 통계정보도 수집된다
.
exec dbms_stats.gather_table_stats(ownname => ’OPS$ORACLE’, tabname=> ’CHECK_INDEX’) ;

SELECT OWNER, TABLE_NAME, LAST_ANALYZED FROM DBA_TABLES WHERE TABLE_NAME =’CHECK_INDEX’;
-- OPS$ORACLE    CHECK_INDEX     2009/11/25 15:21:11

SELECT OWNER, INDEX_NAME, LAST_ANALYZED FROM DBA_INDEXES WHERE TABLE_NAME =’CHECK_INDEX’;
-- OPS$ORACLE    XAK1_CHECK_INDEX    2009/11/25 15:21:11
-- 테이블에 대한 통계정보 수집 시에 인덱스도 자동으로 갱신된다.

-- 인덱스 삭제
DROP INDEX XAK1_CHECK_INDEX ;

-- 테이블 통계정보 갱신 체크
SELECT OWNER, TABLE_NAME, LAST_ANALYZED FROM DBA_TABLES WHERE TABLE_NAME =’CHECK_INDEX’;
-- OPS$ORACLE    CHECK_INDEX     2009/11/25 15:22:45
-- 변화 없음 ( 인덱스를 삭제 하여도, 테이블에 대한 통계정보가 갱신되지 않는다 )

인덱스 생성/삭제/리빌드시에 테이블에 대한 통계정보를 갱신하는게 맞습니다.

일요일 테이블 통계정보를 생성하고, 화요일 해당 테이블에 대한 인덱스를 생성한다면,

그리고, 테이블 통계정보와 인덱스의 통계정보가 많이 상이하다면, 엉뚱한 플랜이 나올수 있겠죠

 

 

 

by 손님 [2009.11.29 18:43:03]
친절한 설명까지... 감사합니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입