SQL - 성능 데이터 모델링
성능 데이터 모델링
- 데이터 모델을 수정하는 비용은 프로젝트가 진행하면서 시간이 지날수록 증가한다. 시간이 지날수록 수정시 발생하는 side effect 가 커지기 때문이다.
- 그래서 초기 단계에서 데이터 모델링이 잘 수행되는게 중요하다.
- 성능 데이터 모델링은 정규화와 반정규화(역정규화)를 적절하게 잘 해야한다.
정규화
- 정규화는 테이블을 관심 사항에 따라 세부적으로 분리하여 중복 데이터를 최소화 하는것을 말한다.
- 이렇게 세부적으로 분리하다보면, 데이터 조회시 많은 join 으로 인한 부하가 클 것으로 예상이 된다.
- 보통, 정규화를 하게되면 데이터 입력, 수정, 삭제 성능은 향상되게 되고, 조회에서는 성능이 향상될 수도 있고 저하될 수도 있다.
- 일반적인 조회 성능은 저하되지만 PK 가 걸려있는 방향으로 조회하게 되면 미미한 수준이고, 조회의 관심사항에 따라서 조건문을 좀 더 가볍게 처리할 수 있어 오히려 속도가 향상될 수 있다.
- 하나의 테이블에 너무 많은 인덱스가 걸려있는 것은 좋지 않다, 정규화를 통해 해소할 수 있는 문제이다.
반정규화(역정규화)
- 정규화와 반대로 데이터들을 하나의 테이블에 모으는 것을 말한다. 이경우 중복된 데이터가 여러 테이블에 저장될 수 있다.
- Join 경로가 멀어 성능저하가 발생할때 반정규화를 수행한다.
- 디스크 IO 가 많이 발생할때 반정규화를 수행한다.
- 통계성 데이터를 추출할때, select할때마다 계산을 하는것 보다 마지막 계산 정보를 반졍규화 하여 저장하는게 좋다.
분산 데이터베이스
- 데이터를 물리적으로 분할하여 트래픽을 분산한다.
-
가상화를 통해 논리적으로 하나의 시스템 처럼 보이도록 한다.
- 업무적, 조직적 특성에따라 분산 구조를 잘 선택해야한다. (수직적 분할/수평적 분할)
인덱스
- 데이터베이스에서 인덱스는 빠른 속도로 데이터를 조회할 수 있도록 접근 경로를 제공하는 오브젝트 이다.
- 데이터 접근 방식에 따라 인덱스 순서를 결정하여야 한다.
- WHERE 문의 조건 순서와 인덱스 순서를 동일하게 하는것이 일반적이다.
- FK의 경우 인덱스를 걸어주는것이 좋다.
참조
책 : SQL 전문가 가이드 2013 Edition , KODB(한국데이터베이스진흥원)