Study/DB

[Oracle] 인덱스 - 리빌드

쑨블리 2021. 5. 25. 13:34

뜻하지 않게 운영업무를 맡게되어 내 업무가 될지 몰랐던,, oracle 관리 작업을 시작하였다.

현재 엑사데이터에 여유공간이 전혀 없이 풀로 사용하고 있어 언제라도 장비가 꺼지면 데이터는 다 날아가버리는 위기 상황이다..

저장공간 확보 대장정의 세번째! 인덱스 리빌드를 해보려한다..

 


인덱스 리빌드는 왜 해야하지?

인덱스와 테이블의 정보가 달라질 때 진행한다.

테이블이 insert/delete/update 될 때 인덱스도 같이 수정된다고 생각한다면 그건 바로 경기도 오산,,

테이블의 수정사항이 많다면 인덱스도 리빌드 해줘야한다!

  • INSERT

INSERT SPLIT 현상이 발생할 수 있다!

INSERT SPLIT이란? 인덱스의 블럭들이 하나에서 두 개로 나눠지는 현상

 

기존 블록에 여유공간이 없는 상황에서 새로운 데이터가 들어오는 상황에 발생

1. 기존 블록의 내용 중 일부를 새 블록에 기록

2. 기존 블록에 빈 공간을 만들어 새로운 데이터를 추가

 

이로인해 속도가 느려질 수 있다.

 

  • DELETE

테이블의 데이터를 DELETE 할 때 인덱스는 지워지지 않는다.

EX) 테이블 10만건, 인덱스 10만건 -> 테이블 5만건 삭제 -> 테이블 5만건, 인덱스 10만건

이 경우 테이블과 인덱스의 정보가 다르기 때문에 인덱스를 사용해도 속도가 느려질 수 있다.

 

  • UPDATE

인덱스는 UPDATE 개념이 없다.

 

테이블에 UPDATE가 일어날 경우

1. 인덱스에서 DELETE 발생

2. 인덱스에 새로운 데이터 INSERT

 

두 가지 작업이 일어나기 때문에 더 부하를 줄 수 있다.

 

인덱스 리빌드의 영향

옵티마이져가 실행 계획을 세울 때 최근에 생성한 인덱스가 영향을 줄 수 있다.

*주의할것은! 리빌드하는 동안 테이블에 LOCK이 발생하기 때문에 업무시간 외에 진행하도록 하자!


인덱스 관리

 

1. 인덱스 조회

/* 인덱스 목록 */
SELECT * FROM USER_INDEXES;

/* 인덱스에 포함 된 컬럼 리스트 */
SELECT * FROM USER_IND_COLUMNS;

 

2. 인덱스 사용 여부 모니터링

사용하지 않는 인덱스는 DROP/VISIBLE 한다.

/* 모니터링 시작하기 */
ALTER INDEX [인덱스명] MONITORING USAGE;

/* 모니터링 중단하기 */
ALTER INDEX [인덱스명] NOMONITORING USAGE;

/* 사용 유무 확인하기 */
SELECT * FROM V$OBJECT_USAGE;

 

3. 인덱스 밸런싱 확인

인덱스 밸런싱은 망가진? 인덱스가 몇%인지 확인하는 쿼리이다.

0에 가까울수록 좋다.

/* 인덱스 통계정보 생성 */
ANALYZE INDEX [인덱스명] VALIDATE STRUCTURE;

/* 인덱스 밸런싱 확인 */
SELECT (DEL_LF_ROWS_LEN/LF_ROWS_LEN)*100 AS BAL FROM INDEX_STATS;

 

4. 인덱스 리빌드

/* 인덱스 리빌드 */
ALTER INDEX [인덱스명] REBUILD;

 


궁금증

1. 운영 데이터 DELETE/INSERT 짱 많이 하는데 리빌드 한적 없음 알아서 되는건가

2. INSERT SPLIT이 인덱스의 문제라는건가

3. 영향 더 없나?

 

 

참고자료

https://lee-mandu.tistory.com/484

 

[오라클] 인덱스의 주의사항 및 관리방법(쿼리문 확인)

안녕하세요. 앞서 인덱스의 개념과 종류에 대해 알아보았습니다. [개발/DB] - [오라클] 인덱스의 원리 및 개념과 종류(B-TREE, BITMAP INDEX) 오늘은 인덱스의 주의사항과 실습을 통하여 인덱스의 관리

lee-mandu.tistory.com

https://aozjffl.tistory.com/285

 

index rebuild 작업

질문 : index에 관해서 공부를 하다가 궁금한 점이 있어 이렇게 질문을 등록합니다. 테이블에 데이터가 자주 들락날락해서 delete된 데이터의 index가 그대로 남아있어, 필요이상으로 많은 공간을 차

aozjffl.tistory.com

https://jack-of-all-trades.tistory.com/400

 

오라클 Index 모니터링 - 안쓰는 인덱스 찾기 (index monitoring), Foreign Key 주의

Oracle DB 가 오래 운영되다 보면, 인덱스의 수가 점점 많아지는 경향이 있습니다. 많은 경우는 한 테이블에 40개 이상의 인덱스가 걸려있는 경우도 종종 발견됩니다. 이렇게 인덱스가 많아지는 이

jack-of-all-trades.tistory.com

https://dev-road.tistory.com/5

 

오라클 인덱스 생성/삭제/리빌드/조회

인덱스 생성 CREATE INDEX 유저명.인덱스명 ON 대상테이블명(대상컬럼명1,대상컬럼명2..); 인덱스 삭제 DROP INDEX 유저명.인덱스명; 인덱스 리빌드 ALTER INDEX 유저명.인덱스명 REBUILD; ALTER INDEX 유저명.인..

dev-road.tistory.com