일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 의사결정나무모형
- 개인프로필스튜디오창업
- 코어뱅킹
- python
- 맥북셋팅
- 학점은행제
- 학점은행제무료강의
- 코딩테스트
- oracleapex
- 프로그래머스
- MSA
- 디렉토리계층구조
- jdk
- 컴퓨터공학학사취득
- Pass By Value
- 은행IT
- 계정계
- 모놀리식
- DB
- 맥북
- 맥북환경설정
- 오라클
- 채널계
- Homebrew
- jdk17
- 렌탈스튜디오창업
- it자격증
- fastapi
- union
- SQL
- Today
- Total
개발머해니
[DB] DML을 하면 무조건 인덱스의 성능저하를 가져올까? 본문
인덱스가 걸려 있는 테이블에 DML을 하면 무조건 성능저하를 가져올까?
결론부터 말씀드리면 아닙니다! DML처리를 하려는 컬럼이 INDEX 컬럼이냐 아니냐에 따라 성능차이가 달라집니다.
또한 DML 처리건수가 많지 않을 때에는 사용자가 느끼지 못할만큼 성능 저하에 끼치는 영향이 아주 미미하다고 합니다.
그럼 왜 테이블에 INSERT가 잦으면 인덱스 성능이 저한된다고 하는 걸까요?
테이블은 힙구조인데 반해, 인덱스는 클러스터형이기 때문입니다.
- 테이블 : 정렬이 안된 힙구조의 데이터 집합
- 인덱스 : 클러스터링된 열을 사용하여 사용자 정의 열 정렬 순서가 있는 데이터 집합
아래 그림을 보시면 이해가 쉬울 것 같습니다! 일반 테이블과 인덱스 테이블의 차이가 보이시나요?
가장 왼쪽의 테이블이 바로 클러스터링 되지 않은 기본 테이블입니다. 내용을 보시면 데이터들이 뒤죽박죽 입력한 순서대로 정렬되어 있는 것을 알 수 있습니다. 이때 INSERT 하게 되면 남은 빈공간에 순서 상관없이 데이터를 추가만 하면 되기 때문에 성능저하와 관련이 없습니다.
반면, 오른쪽 두 개의 Clustered 테이블을 보시면 예쁘게 정렬되어 있는 것을 볼 수 있습니다. 이게 바로 인덱스 테이블 구조라고 보시면 됩니다. 이때, 새로운 데이터를 INSERT하게 되면, 정렬 순서에 맞는 빈 공간을 찾아 추가해야 하기 때문에 성능의 저하를 가져올 수 밖에 없습니다.
심지어 데이터를 추가할 빈 공간이 없다면? 기존 블록의 내용 중 일부를 새 블록에 기록한 후 기존 블록에 빈 공간을 만들어서 새로운 데이터를 추가해야하는 INDEX Split 현상이 발생하기 때문에 속도가 느려질 수 밖에 없게 됩니다.
DELETE와 UPDATE도 똑같은 이유로 인덱스의 성능저하를 가져올까요?
아닙니다. 우선 DELETE부터 설명해드리자면, 테이블에 DELETE가 발생해도 인덱스는 삭제되지 않습니다. 즉, 테이블 데이터는 삭제되어도 인덱스 테이블에는 그 내용이 그대로 남게 되는 거죠. 그래서 테이블 데이터는 1만건밖에 없어도, 인덱스 테이블에는 10만건의 데이터가 남아있을 수 있기 때문에 성능 저하는 가져온다고 말하는 것입니다.
UDPATE의 경우는 어떨까요? 사실 인덱스에는 UDPATE의 개념이 없습니다. 그래서 만약 테이블에 UPDATE가 발생한다면, 인덱스에서는 [DELETE → INSERT] 즉, 두 번의 DML이 이루어지게 됩니다. 그래서 UDPATE는 INSERT, DELETE보다 2배의 작업이 수행되기 때문에 가장 부하가 크다고 볼 수 있습니다.
그럼 DML이 자주 발생한 INDEX는 어떻게 관리해야 할까?
인덱스는 한번 만들어 놓는다고 해서 영구적으로 잘 사용할 수 있는 것이 아니라 데이터의 insert, delete, update 등을 통하여 성능이 저하되기 때문에, 인덱스를 지속적으로 사용하기 위해서는 꾸준한 관리가 필요하다고 합니다. 이를 바로 '인덱스 리빌드'라고 합니다. 저는 DBA가 아니기 때문에 해당 작업을 할 일은 없을 것 같아서 타 블로그 링크로 대체합니다! 자세한 내용이 궁금하신 분들은 아래 블로그를 참고해보세요^^~
※ 인덱스 리빌드 참고 블로그 :
'백엔드' 카테고리의 다른 글
[DB] 오라클에 이모지(Emoji)를 저장할 수 있을까? (0) | 2023.08.31 |
---|---|
[스프링] 클라이언트가 에러났을때도 ResponseDTO를 내려달라고 하면 어떻게 해야할까? (0) | 2023.08.30 |
[스프링] 예외처리 종류과 효과적인 사용 방법 (0) | 2023.08.29 |
[DB] 인덱스는 어떤 기준으로 잡는 게 좋을까? (0) | 2023.08.27 |
[DB] 파티션의 개념, 필요성, 종류 (0) | 2023.08.27 |