index 생성

이름·2021년 6월 22일
0

생성해야 하는 경우

  1. 외래키가 사용되는 열에는 인덱스를 생성해주는 것이 좋다.
    (이유: 참조 키를 빠르게 확인하고 테이블 full 스캔을 하지 않기 위해서.)

  2. JOIN에 자주 사용되는 열에는 인덱스를 생성해주는 것이 좋다.
    (이유: 조인을 설정할 때는 조인을 하려는 값에
    인덱스를 걸어줘야, 속도가 빨라진다.)

생성하지 않아야 하는 경우

  1. 데이터의 중복도가 높은 열은 인덱스로 만들어도 효용이 없다.
    (예 : 성별, 타입이 별로 없는 경우)
  1. DB의 변경작업(Insert, Update, Delete)이
    잦은 경우엔 성능이 저하되므로 생성하지 않아야 한다.

주의사항
INSERT
[기존 블록에 여유 공간이 없는 상황에서]
추가로 새로운 블록을 할당 받고 복잡한 작업들을 수행하게 되면
(모든 수행 과정은 Redo에 기록 -> 많은 양의 Redo를 유발.)  
->성능저하

DELETE
일반적으로 table에서 데이터를 delete 하면 값이 지워지지만,
이와 다르게 index에서는 데이터를 delete 할 경우 데이터가 지워지지 않고
사용 안 됨 표시만 해 둔다.
[ 테이블에 데이터가 1만 건 있는 경우, ]
인덱스에는 2만 건이 있을 수 있다 는 뜻 

UPDATE

일반적으로 table에서 데이터를 update 하면 delete 후에 insert 작업이 진행되지만,
index에서는 update가 발생할 경우 delete와 insert 두 개의 작업이
동시에 일어 남.
다른 DML보다 더 큰 부하를 주게 됨.

  • 갑자기 인덱스를 추가하면 잘 돌아가고 있던 쿼리에 옵티마이저가 실행계획을 바꾸는 경우가 생겨 아주 느려 지는 경우가 생김.
    따라서
    기존의 테이블에 인덱스를 추가할 경우, 기존에 있던 SQL 문장들까지
    전부 고려한 후 인덱스를 생성해야 함. 

*옵티마이저: SQL을 가장 빠르고 효율적으로 수행할 최적의 처리경로를 생성해 주는 DBMS내부 핵심엔진

[인덱스는 양날의 검]

0개의 댓글