로우체이닝

윤상훈·2022년 2월 18일
0

SQLP

목록 보기
2/9
로우체이닝이 발생할 정도로 한 테이블에 많은 칼럼들이 존재할 경우 조회성능저하가 발생할 수 있다. 트랜잭션이 접근하는 칼럼유형을 분석하여 1:1로 테이블을 분리하면 디스크 I/O가 줄어들어 조회 성능을 향상 시킬 수 있다.
--SQL 자격검정 실전문제 p.30, Q.45

맨 처음 신입으로 입사할 당시,
하나의 프로젝트를 구상부터 설계까지 한달간 해보았는데
당시 그렸던 ERD를 기술팀장님께서 보시곤
"가장 비용이 크게 드는게 DB I/O" 라고 하셨던게 기억에 남는다.

45번 문제를 보고 당시 기억이 떠올라
해당 문제에 관한 해설을 주석과 함께 옮긴다.


Case:
한 테이블에 많은 컬럼들이 존재

  • Cause:
    데이터가 물리적으로 저장되는 디스크 상에 넓게 분포할
    가능성이 커지게 되어 디스크 I/O가 대량으로 발생할 수 있다.

컴퓨터 하드디스크도 데이터가 불연속적으로 저장되어, 즉 파편화가 발생하여
이를 추후 디스크 조각모음을 통해 공간을 확보하고 읽기 성능을 향상시켜줄 필요가 있는데, 이와 유사한 경우를 말하는 것 같다.

  • Effect:
    성능 저하 발생 (가능성 증가)

  • Solution:

    1. 트랜잭션이 접근하는 칼럼유형을 분석
    2. 자주 접근하는 칼럼, 상대적으로 접근 빈도가 낮은 칼럼 구분하여 1:1로 테이블을 분리
      --> 디스크 I/O가 줄어들어 성능을 향상 시킬 수 있다.

      정규화의 중요성이 다시 한번 드러난다.

      테이블 내에서 칼럼의 위치를 조정하는 것은 데이터 주로 채워지는 칼럼을 앞 쪽에 위치시키고, 데이터가 채워지지 않고 주로 NULL 상태로 존재하는 칼럼들을 뒤쪽에 모아둠으로써 로우의 길이를 어느정도 감소시킬 수 있으나, NULL 상태이던 칼럼에 나중에 데이터가 채워지게 될 경우 더 많은 로우체인이 발생할 수도 있기 때문에 바람직한 해결책이라고 보기에 부족하다.

      무엇보다도 데이터가 채워지지 않고 NULL 상태로 존재하게 되는 칼럼들이 많이 나타나는 경우는, 너무 많은 엔터티들에 무리하게 동질성을 부여하여 통합을 수행했거나, 예측하기 어려운 미래 시점을 겨냥하여 과도하게 의욕적으로 속성을 확장한 경우 등에서 주로 나타나기 때문에, 자주 사용되는 칼럼들이나 현시점에서 주로 사용되는 칼럼들을 한데 모으고, 사용빈도가 낮은 칼럼들이나 미래 시점에 사용될 것으로 예상되는 나머지 칼럼들을 한데 모아 별도의 1:1 관계 엔터티로 분리하는 등의 데이터모델 설계 수정을 고려해 보는 것이 좋다.

profile
데이터를 사랑하는 개발자

0개의 댓글