본문 바로가기
개발자 일지/DB

DB 튜닝 공부 (개념, 용어, 최적화 전략 등)

by 네빌링 2024. 9. 27.
반응형

DB 튜닝에 대해 개발자도 어느정도 공부를 해둘 필요성을 느끼기에 관련된 포스팅을 하려고 합니다. 

 

DB-튜닝-공부-썸네일

 

[목차]

  1. DB 튜닝의 개념 및 필요성
  2. DB 튜닝 관련된 학습 내용
    1. 블럭
    2. 인덱스
    3. 소프트 파싱, 하드 파싱
    4. 정규화, 비정규화

 

1. DB 튜닝의 개념 및 필요성

 

데이터베이스 성능 최적화는 개발자들도 SQL 튜닝을 통해 어느정도 필요성을 이해할 것이라고 생각합니다.

쿼리 실행 속도와 조회 또는 저장시 효율적으로 처리하기 위해 인덱스 관리 등 실행계획을 최적화하는 것이 중요합니다.

최근 DB관련된 학습을 하면서 배운 내용을 간단히 정리하려고 합니다.

기초적인 내용과 키워드 중심으로 간단히 살펴보겠습니다.

 

2. DB 튜닝 관련된 학습 내용

 

1) 블럭

 

데이터베이스에서 데이터를 저장하는 기본 단위가 블럭입니다.

디스크 I/O를 통해 읽고 쓰는 물리적 단위입니다. 

데이터 조회시 많은 블럭을 읽으면 느리고 성능이 저하되기 때문에 최소한의 블럭을 읽어오는 게 중요합니다.

흔히 말하는 풀 테이블 스캔(풀스캔)을 하면 데이터의 모든 블럭을 읽고, 인덱스를 적용하면 선택적으로 블럭을 읽습니다.

 

2) 인덱스

 

인덱스조회시 검색 성능을 높여주는 자료구조입니다.

흔히 SQL 조회시 속도가 느리면 인덱스를 걸자고 얘기를 하는데요.

 

보통 책의 목차와 비유됩니다.

인덱스를 걸면 책의 목차를 통해 페이지를 찾듯이 속도가 빨라집니다.

그리고 위에서 언급한 블럭단위를 모두 읽지 않고 일부분만 읽습니다.

이는 쿼리 성능 최적화와 불필요한 디스크 I/O를 줄여줍니다.

 

보통 WHERE, JOIN 조건의 컬럼에 인덱스를 많이 거는데요.

WHERE 조건에 걸면 필터링이 빨라집니다. 조건이 많으면 복합 인덱스도 생각해볼 수 있습니다.

JOIN 조건에 걸면 테이블간 결합 작업이 최적화되는데 외래키(Foreign key)에 걸면

조인 성능이 향상됩니다.

 

그러나 인덱스를 무조건 WHERE 조건에 있다고 걸면 안 되고 고려를 해야하는데요.

인덱스가 많으면 데이터 저장,삭제,업데이트시 부하가 증가합니다. 

자주 변경되는 데이터에는 인덱스 사용을 신중히 생각해야 합니다.

또한 작은 테이블은 오히려 풀테이블스캔이 더 나을수도 있기 때문에 이런 점도 고려해야합니다.

 

그리고 선택도가 낮은 컬럼(컬럼 값 종류가 몇 개 없는 코드 값 등)은 인덱스 성능 향상 효과가 미미하다고 합니다.

 

인덱스 공부도 깊게 하면 공부할 것이 많아서 추후 자세히 포스팅해보려고 합니다.

 

3) 소프트 파싱, 하드 파싱

 

소프트 파싱은 데이터베이스가 쿼리 실행할 때 이전 실행과 유사한 쿼리를 재사용하는 것을 말합니다.

캐시를 활용해 재파싱 과정을 피할 수 있어서 성능이 향상됩니다.

최근 DBA분 리뷰 때 소프트 파싱으로 인해 index를 적용했음에도 이전 실행계획이 동시에 실행되었다고 말씀주셨습니다.

이는 캐시때문인데요.

웹서버에 캐시가 있기 때문에 웹서버를 재시작할 필요성이 있다는 걸 알게되었습니다. 

 

하드파싱은 반대로 새롭게 실행계획을 생성하는 과정이기 때문에 리소스 소모가 높습니다.

 

자주 실행되는 쿼리는 소프트 파싱을 유도해 성능을 높이는 쪽이 좋습니다.

 

4)정규화, 비정규화

 

정규화는 데이터를 중복 없이 논리적으로 나누어 관리하는 방식입니다.

나누기 때문에 추후 테이블 간 JOIN을 통해 데이터를 조회합니다.

 

반면 비정규화는 성능 최적화를 위해 일부 데이터를 중복 저장하여 관리하는 방식입니다. 

지나친 정규화는 JOIN이 많아지기 때문에 쿼리 성능을 저하할 수 있으므로, 상황에 따라 비정규화를 고려할 수 있습니다.


지금까지 DB 튜닝과 관련된 학습 내용을 알아봤습니다.

개발자 입장에서는 다 중요하지만 특히 인덱스가 실무에서 자주 쓰이고 개발자가 쉽게 접근할 수 있는 

튜닝 요소이기 때문에 추후 자세히 포스팅해보겠습니다.

 

감사합니다!

 

 

 

썸네일 출처: juicy_fish / Freepik
반응형