새싹 DBA/Scripts

[오라클] 파티션 테이블 테이블스페이스 변경, 인덱스 리빌드

LIMMI 2024. 10. 11. 16:31

파티션 테이블 작업 유형에 따른 인덱스 상태

1. 파티션 테이블 조회

SELECT * FROM DBA_PART_TABLES
 WHERE OWNER IN ('OWNER');

2. 파티션 테이블의 파티션 조회 

SELECT *
  FROM DBA_TAB_PARTITIONS
 WHERE TABLE_OWNER IN ('OWNER');

3. 파티션 인덱스 조회

SELECT *
  FROM DBA_PART_INDEXES
 WHERE OWNER = 'OWNER';

4. 파티션 별 로컬 인덱스 조회

SELECT *
  FROM DBA_IND_PARTITIONS
 WHERE INDEX_OWNER = 'OWNER';

5. 글로벌 파티션 조회

SELECT *
  FROM DBA_INDEXES
 WHERE TABLE_NAME = 'TABLENAME';

6. 파티션 테이블의 DEFAULT TABLESPACE 변경

ALTER TABLE OWNER.TABLE명 MODIFY DEFAULT ATTRIBUTES TABLESPACE 테이블스페이스명;

7. 파티션 테이블 INDEX TABLESPACE DEFAULT 변경

ALTER INDEX 인덱스명 MODIFY DEFAULT ATTRIBUTES TABLESPACE 테이블스페이스명;

8. 이미 생성된 파티션의 테이블 스페이스 변경

-- 한번에 바꿀 수 없음--
SELECT 'ALTER TABLE '||'TABLE_NAME||' MOVE PARTITION '||PARTITION_NAME ||' TABLESPACE 테이블스페이스명;'
  FROM DBA_TAB_PARTITIONS
 WHERE TABLE_NAME = '테이블명'
 ORDER BY PARTITION_NAME;

9. 인덱스 STATUS 조회 ( UNUSABLE, 리빌드가 필요한 인덱스)

--로컬 인덱스 

SELECT *
  FROM DBA_IND_PARTITIONS A
     , DBA_PART_INDEXES B
 WHERE A.INDEX_OWNER = '인덱스오너명'
   AND A.INDEX_NAME = B.INDEX_NAME
   AND A.STATUS <> 'USABLE'
   --AND B.TABLE_NAME = '테이블명';
   
-- 글로벌 인덱스
SELECT *
  FROM DBA_INDEXES
 WHERE STATUS <> 'VALID';

10. 인덱스 리빌드

--글로벌 인덱스 리빌드 
ALTER INDEX 소유자.인덱스명 REBUILD; -- TABLESPACE 테이블스페이스명;

-- 로컬 인덱스 리빌드 / 한번에 안됨
SELECT 'ALTER INDEX 소유자.'||A.INDEX_NAME||' REBUILD PARTITION '||A.PARTITION_NAME||';'
  FROM DBA_IND_PARTITIONS A
     , DBA_PART_INDEXES B
 WHERE B.TABLE_NAME = '테이블명'
   AND A.INDEX_NAME = B.INDEX_NAME
   AND A.STATUS = 'UNUSABLE'
 ORDER BY A.INDEX_NAME, A.PARTITION_NAME;