문제해결_SQL - index(인덱스)

찬이·2022년 5월 6일
0

문제해결

목록 보기
2/3

※ 모든 데이터는 Oracle에서 제공하는 학습용 데이터를 사용하였다.

SQL에서 index 관련 실습 중 하나의 오류를 발견하였다.

CREATE UNIQUE INDEX idx_employees3_id
ON employees3(employee_id)
;

위 코드가 문제가 될 건 없지만, 특정 상황에서는 에러를 발생시킬 수 있다.
이 점을 이해하려면 우선 DBMS에서의 index에 대한 이해가 필요하다.

index란?

index는 다른 말로 '색인'이라고도 한다.

색인의 사전적 정의는

<책 속의 내용 중에서 중요한 단어나 항목, 인명 따위를 쉽게 찾아볼 수 있도록 일정한 순서에 따라 별도로 배열하여 놓은 목록> 이다. (출처 : 네이버 국어사전)

우리가 흔히 책을 볼 때 자신이 보고 싶은 특정 내용을 찾기 위해서는
앞에 목차를 살펴보고는 한다.

목차도 색인의 일종이다.

이처럼, 광대한 데이터베이스 안에서 특정 내용을 빠르고 쉽게 찾기 위해 DBMS 상에서도 index가 존재한다

DBMS에서 index가 필요한 이유는 다음과 같다.

index를 생성해 줌으로서 DBMS의 해당 테이블의 조회 속도를 빠르게 볼 수 있다.

사실, Oracle 내의 학습용 데이터에는 데이터가 그렇게 많지 않기 때문에 체감이 들진 않지만,
실제 현장에서는 수 많은 데이터를 보유하고 있기에 index가 꼭 필요하다고 할 수 있다.

하지만, index가 필요없는 경우도 존재한다.

  • 데이터가 수 천건 미만인 경우
  • 데이터 조회보다 삽입, 수정, 삭제 처리가 많은 테이블

데이터가 수 천건 미만인 경우에는 굳이 index를 사용하지 않아도
속도의 체감이 들지 않기 때문에 사용을 지양하는 편이다.

또한 DML 명령(select, update, insert, delete)을 사용할 경우,
index 테이블에도 데이터를 같이 갱신을 해줘야 하기 때문에
해당 명령을 사용 시 성능이 확연히 느려진다.

그럼 SQL에서 어떻게 index를 생성할 수 있을까?
아래 코드를 살펴보자.

-- UNIQUE INDEX 생성
CREAT UNIQUE INDEX 인덱스명
ON 테이블명(컬럼)
;

UNIQUE INDEX는 UNIQUE, 즉 '중복이 없는 값'이다.
만약 테이블에 중복값이 있을 경우 index 생성이 제한된다.

-- NON-UNIQUE INDEX 생성
CREATE INDEX 인덱스명
ON 테이블명(컬럼)
;

그와 반대로 NON-UNIQUE INDEX는 중복값이 허용이 된다.

첫 번째 코드는 어디서 많이 본 형식이다.
맞다. 첫 번째 코드는 맨 처음에 보았던 오류가 발생한 코드와 동일한 형식이다.

그럼 우리는 왜 때문에 해당 코드가 오류가 발생했는지를 눈치챌 수 있을 것이다.
바로 테이블의 컬럼에 <중복값>이 있었기 때문이다.

우리는 index를 생성할 때 "어디"에 "어떻게" 생성할지 고민해야 한다.

만약, 사원번호와 같이 그 값이 고유한 값이고, 조회가 주 업무인 테이블이면 UNIQUE INDEX를 사용하는 것이 바람직할 것이다.

위에 코드를 다시 가져와보자.

CREATE UNIQUE INDEX idx_employees3_id
ON employees3(employee_id)
;

위 코드는 employees3 라는 더미 테이블을 만들고 employee_id에 대한 index를 생성한 것이다.

EMPLOYEES3 테이블의 Properties의 Indexes 탭에 새롭게 생긴 것을 볼 수 있다.
자세히 보면 Unique 체크박스에 체크되어 있는 것 또한 확인할 수 있다.
(참고로 첫 번째 인덱스는 first_name으로 생성한 일반 인덱스이다.)

profile
시작하는 코딩러입니다.

0개의 댓글