-
인조식별자(Artificial Identifier) :
- 인조식별자란 테이블의 각 행을 고유하게 식별하기 위해 인위적으로 생성된 키를 의미한다.
- 예를 들어,
고객 ID
를 자동 증가하는 숫자로 부여하는 것이 대표적인 인조식별자 방식이다.
- 인조식별자는 복잡한 자연식별자(자연키) 대신, 간단하고 관리하기 쉬운 형태의 키(고유식별자)를 사용하고자 할 때 주로 사용된다.
-
인덱스(Index)의 역할과 필요성
- 데이터베이스에서 인덱스는 빠른 검색을 위해 사용하는 자료구조다.
- 예를 들어, 책의 목차처럼 특정 데이터를 찾기 쉽게 만드는 기능이다.
- 테이블의 특정 컬럼에 인덱스를 생성하면, 검색 성능이 크게 향상된다. 따라서 데이터를 빠르게 조회하고 싶은 컬럼에 인덱스를 적용한다.
-
인덱스와 DML 작업의 상관관계: 인덱스가 DML에 취약한 이유
- 여기서 DML(Data Manipulation Language)은 데이터를 조작하는 작업(쓰기 작업)을 의미하며,
INSERT
, UPDATE
, DELETE
명령어가 포함된다.
- 인덱스는 검색 속도에 이점이 있지만, 반대로 DML 작업에는 부담이 될 수 있다.
- 인덱스를 생성하면, 데이터 삽입, 수정, 삭제 시 인덱스까지 함께 갱신해야 하기 때문이다.
- 특히, 인덱스가 많을수록 갱신해야 할 인덱스가 많아지면서 작업 속도가 느려진다.
- 따라서 인덱스는 읽기 작업(SELECT)에는 도움이 되지만, 쓰기 작업(DML)에는 성능 저하의 원인이 될 수 있어 균형 잡힌 설계가 필요하다.
결과적으로 , 인덱스는 검색 성능을 높여주지만, DML(DML(Data Manipulation Language) 작업이 많아지면 인덱스를 갱신하는 작업이 성능 저하로 이어질 수 있다.
인덱스 스플릿(Index Split) 현상: DML 작업 시(특히 데이터 삽입이 잦은 경우) 발생하는 문제
- 인덱스 스플릿 : 인덱스 페이지가 가득 찬 상태에서 새로운 데이터를 중간에 삽입해야 할 때 발생하는 인덱스 페이지 분할 현상, 인덱스가 자주 갱신되거나 중간 삽입이 빈번한 환경에서는 이 스플릿 현상이 빈번해짐.
- 예를 들어, 순서가 정해진 인덱스에 중간 위치에 새로운 값을 넣어야 하는 상황에서 기존 페이지에 공간이 부족할 경우, 인덱스 페이지를 두 개로 나누어 데이터를 재배치하게 된다.
이로 인해 데이터 재배치와 새 페이지 생성 작업이 추가로 발생하여 성능 저하를 일으킨다.
인덱스 페이지를 나눈다?
인덱스는 데이터를 효율적으로 검색하기 위해 만들어진 특정한 자료 구조 이며, 이 자료 구조는 여러 개의 페이지로 나뉘어 데이터를 저장한다. '페이지'란 데이터베이스가 데이터를 저장하는 기본 단위로, 특정 크기의 데이터 묶음이다.
인덱스 스플릿(Index Split) 현상 발생의 흐름
-
인덱스는 정렬된 순서로 데이터를 저장해 둔다. 예를 들어, 숫자 순서로 데이터를 정렬한다고 하면 10, 20, 30, 40, 50 같은 순서로 인덱스 페이지에 저장된다.
-
인덱스 페이지는 한정된 공간을 가지고 있으므로, 한 페이지에 저장할 수 있는 데이터의 양이 정해져 있다. 페이지가 꽉 차면 새로운 데이터를 그 페이지에 추가할 수 없게 된다.
-
예를 들어, 인덱스가 10, 20, 30, 40으로 차 있는데 중간에 25라는 값을 추가해야 한다면 문제가 생기며, 이미 페이지가 꽉 차 있으므로 더 이상 데이터를 넣을 공간이 없게 된다.
-
이럴 때 데이터베이스는 인덱스 페이지를 두 개로 나눠서(스플릿) 데이터를 재배치한다.
- 예를 들어, 기존 페이지를 두 개로 나누고, 한 페이지에는 10, 20을 넣고, 다른 페이지에는 25, 30, 40을 넣는 방식으로 데이터를 재구성하게 된다.
-
이렇게 되면 새로운 페이지가 추가되고, 기존 데이터가 재배치되면서 더 많은 공간을 확보하게 되며, 이 과정에서 추가적인 작업과 시간이 필요하기 때문에 성능 저하가 발생할 수 있다. (성능 저하가 발생하는 이유는, 페이지가 나뉘게 되묜서 새로운 페이지 생성과 데이터 이동 작업을 필요로 하기 때문에, 추가적인 자원과 시간이 소요되기 때문이다.
- 데이터가 자주 삽입되거나 인덱스가 자주 변경되는 경우에는 이 스플릿 현상이 자주 발생하여 전체 시스템의 성능에 부정적인 영향을 줄 수 있다.
( 예를 들어, 날짜가 순차적으로 증가하는 주문 테이블이 있고, 주문일
컬럼에 인덱스를 걸면, 새로운 주문이 들어올 때마다 날짜가 인덱스의 끝부분에 추가되므로 중간에 삽입이 발생하지 않아 인덱스 스플릿이 거의 일어나지 않는다.)
하지만, 무작위로 생성되는 고객 ID 컬럼에 인덱스를 걸면 새로운 데이터가 중간에 삽입될 가능성이 높아 인덱스 스플릿이 빈번히 발생하여 성능 저하를 초래할 수 있다.)
그러므로, 인덱스를 설계할 때는 삽입이 자주 일어나는 컬럼에 대해 신중하게 고려하고, 인덱스 스플릿 현상이 성능에 미치는 영향을 최소화할 수 있도록 효율적인 인덱스 설계 (삽입이 자주 일어나는 컬럼에 인덱스를 적용할 때, 인덱스 스플릿이 최소화될 수 있도록 설계하도록 하는 설계)가 필요하다.