전문가칼럼

DBMS, DB 구축 절차, 빅데이터 기술 칼럼, 사례연구 및 세미나 자료를 소개합니다.

DB 성능 제고를 위한 채번의 이해와 방식별 장단점 비교

전문가칼럼
DBMS별 분류
Etc
작성자
dataonair
작성일
2017-09-04 00:00
조회
13745




◎ 연재기사 ◎


물탱크 구조로 알아본 오라클의 블록 옵션 ‘PCTFREE와 PCTUSED’


이산가족 찾기 생방송을 통해 배우는 DB 원리


개발자에게 맞는 DB 공부방법 찾기: 물리적 분류와 논리적 분류 그리고 인덱스


데이터베이스 인덱스의 오해와 진실


쉬운 것이 올바른 것이다. ‘인덱스 끝장리뷰’ (상)


쉬운 것이 올바른 것이다. ‘인덱스 끝장리뷰’ (하)


누구도 알려주지 않았던 ‘오라클 인덱스 생성도’의 비밀


누구도 알려주지 않았던 ‘오라클 쿼리 작성의 비법’


퀴리 최적화 및 튜닝을 위한 오라클 공정쿼리 작성법


만능 쿼리와 한 방 쿼리


오라클 옵티마이저 ‘CBO와 RBO’ 이해하기


재미있는 DB 이야기 ‘60갑자와 쿼리’


그림으로 배우는 ‘오라클 조인의 방식’ 이야기


반드시 알아야 하는 오라클 힌트절 7가지


오라클 플랜을 보는 법


개발자들의 영원한 숙제 ‘NULL 이야기’


알면 유용한 오라클 기능 ‘GATHER_PLAN_STATISTICS’


알면 유용한 오라클 기능들


오라클 DICTIONARY를 활용한 DB툴 프로그램 ‘FreeSQL’


이제는 말할 수 있다: 주식 자동매매 프로그램(상)


이제는 말할 수 있다: 주식 자동매매 프로그램(하)


개발자들이 자주 접하는 오라클 에러 메세지


재미있는 DB 이야기 ‘사라진 날짜를 찾아라’


오라클 랜덤 함수와 사용자 정의 함수


그림으로 배우는 ‘공정쿼리와 인덱스 생성도’


이병국의 개발자를 위한 DB 이야기: 디폴트 세팅의 함정과 오라클 파라미터


재미있는 DB 이야기 ‘놀라운 마방진의 세계’


오라클 운반 최소 단위 BLOCK


이병국의 개발자를 위한 DB 이야기: 이세돌과 알파고의 세기의 대결


이병국의 개발자를 위한 DB 이야기(30회) : DB 엔지니어의 가볍게 읽는 세상 이야기


이병국의 개발자를 위한 DB 이야기: 튜닝(31회) : 개발자를 위한 DB 튜닝 실전(1편)


이병국의 개발자를 위한 DB 이야기: 튜닝(32회) : 개발자를 위한 튜닝 실전(2편)


이병국의 개발자를 위한 DB 이야기: 튜닝(33회) : 개발자를 위한 튜닝 실전(3편)


이병국의 개발자를 위한 DB 이야기: 튜닝(34회) : 개발자를 위한 DB 튜닝 실전(4편)


이병국의 개발자를 위한 DB 이야기: 튜닝(35회) : 개발자를 위한 튜닝 실전(5편)


이병국의 개발자를 위한 DB 이야기: 페이징 처리에 대한 이해 (36회)


보기 좋은 떡이 먹기도 좋다 - 좋은 쿼리 좋은 성능


테이블의 수직분할과 수평분할에 대한 이해


DB 성능 제고를 위한 채번의 이해와 방식별 장단점 비교


이병국의 개발자를 위한 DB 이야기: 마지막회 : ‘개발자를 위한 DB 이야기’ 연재를 마치며



이병국의 개발자를 위한 DB 이야기: 성능(39회)

DB 성능 제고를 위한 채번의 이해와 방식별 장단점 비교



이병국 andongcn@dreamwiz.com
프리랜서 DB 엔지니어. 동아제약 전산실에서 SW 개발 업무를 시작으로 프리랜서 개발자로 독립해 활동하던 중 우연한 기회에 DB와 인연을 맺게 됐다. 현재 삼성생명 전산 운영팀에서 쿼리 성능을 개선하는DB 튜닝과 IOA 업무를 맡고 있다. 개발자 출신의 DB 엔지니어로 활동하면서 개발자에게 DB 관련 지식이 꼭 필요함을 절감했다. ‘정보의 불균형이 시장 왜곡을 가져온다’는 ‘레몬시장이론’은 중고차 거래에서 흔히 나타나기 쉽다. 좋은 차와 나쁜차를 아는 중개인과 모르는 구매자 사이에는 정보의 비대칭때문에 구매자가 손해를 볼 수 있다. 구매자도 차에 대해 기본적인 지식을 알고 있어야, 정보의 균형이 맞으므로 서로 손해를 보지 않고 합리적인 가격에 차를 거래할 수 있다. 마찬가지로 개발자들도 DB에 대해 기본적인 지식을 습득해 정보의 균형을 맞추면, DB 엔지니어와 협업이 더 쉬워지고 한단계 더 발전한 자신의 모습을 발견할 것이다.



채번에 대한 이해

오늘의 주제는 DB에 있어서 번호표에 대한 이야기다. 우리는 이것을 채번(採番)이라 한다. 채번이란 말은 일본의 영향을 받은 단어로서 새로운 번호를 딴다는 의미다. 전화번호, 차량번호 등 고유번호를 할당 받아 사용한다는 의미지만, 일상적으로 널리 사용되는 말은 아니다. 요즘은 별로 사용하지 않아서 점점 잊혀져 가는 단어이나 아직까지 산업계에서는 사용되고 있다.

데이터베이스에서 채번은 대부분 PK 컬럼의 용도로 사용한다. 업무적으로 의미 있는 컬럼들을 PK로 사용하는 경우가 많지만, 가끔은 필요에 의해서 아무런 의미가 없는 시스템적 일련번호 형식의 채번을 PK 컬럼으로 사용하기도 한다. 업무적으로 의미 있는 컬럼을 PK로 사용하는 것이 옳은지 아니면 의미 없는 채번을 PK로 사용하는 것이 더 옳은지는 중요하지 않다. 서로 사용하는 목적이 충분히 존재하기 때문이다. 이번 연재는 채번에 대한 이해와 그 종류 및 장단점에 대해서만 이야기 하고자 한다.

채번을 사용할 때 한 컬럼으로 PK를 구성할 수 있어서 좋지만, 의미 없는 컬럼이므로 낭비일 수 있다. 또한 자식 테이블이 많을 경우 한 컬럼만 FK가 되기 때문에 조인이 많을 시 유리할 수 있다. 하지만 Insert 처리 시에 Unique 하게 관리할 부담도 역시 존재한다. 결론적으로 채번은 자식 테이블이 많아서 조인이 부담이 될 때 사용하면 유용하다. 덧붙여 순차적으로 계속 증가하여 업무적으로 PK를 지정하기 힘든 경우에 사용하면 좋다.

데이터 생성 시 PK 값을 증가시켜서 유일하게 식별되게 하는, 채번을 생성하는 방식에는 여러 가지가 있는데 보편적으로 사용하는 방식은 아래와 같다.

첫째, 채번을 생성하고 관리하는 채번 테이블을 이용하는 방식
둘째, 채번이 필요한 각각의 테이블에서 최대값을 이용하는 방식
셋째, DB에서 지원하는 시퀀스를 이용하는 방식

어느 방식이 좋은지 나쁜지에 대한 구분은 무의미하다. 세 가지 방식에 장단점이 있으므로 각자가 처한 상황에 맞는 가장 알맞은 방식을 사용하면 되기 때문이다.



채번 테이블을 이용하는 방식

채번을 생성하고 관리하는 채번 테이블을 이용하는 방식은 중복 에러의 가능성은 없고 순차적인 데이터 입력이 가능하다는 장점이 있다. 하지만 채번 테이블 관리에 대한 부담이 있다. 더 심각한 것은 잠금 현상에 의한 성능 저하를 불러 온다는 것이다.

1단계 : 채번 테이블에 채번을 UPDATE 한다.
2단계 : 대상 테이블에 채번 값을 INSERT 한다.
3단계 : COMMIT 한다.

한 트랜잭션의 1, 2, 3 단계 처리가 끝날 때까지 다른 트랜잭션은 대기 상태에 있으므로 성능 저하의 원인이 될 수 있다. 하지만 아래와 같이 COMMIT 단계를 하나 더 추가 한다면 채번 테이블의 잠금 현상은 방지할 수 있다. 하지만 순차적인 데이터 입력은 불가능하다. 순차적인 데이터 입력이 불가능 하다는 의미는 우리가 의도한 데이터가 입력되지 않을 수도 있다는 의미이다.

1단계 : 채번 테이블에 채번을 UPDATE 한다.
2단계 : COMMIT 한다.
2단계 : 대상 테이블에 채번 값을 INSERT 한다.
3단계 : COMMIT 한다.

채번이 필요한 테이블이 많을수록 채번 테이블의 채번 구분의 종류가 많아진다. 즉 채번 테이블의 레코드 수는 채번이 필요한 테이블의 개수와 동일하다. 물론 더 세분화하여 관리할 수도 있을 것이다. 아래의 [그림 1]은 채번 테이블에 대한 기본적인 개념을 설명한 것이다.

column_img_2978.jpg

[그림 1] 채번 테이블을 이용하는 방식의 예시



테이블에서 최대값을 이용하는 방식

채번이 필요한 테이블에서 MAX 값을 구해 이용하는 방식은 성능이 좋고, 순차적 데이터 입력이 가능하다. 또한 채번 테이블을 이용하는 경우보다 관리에 대한 부하는 없다. 아래와 같은 방법으로 사용하면 된다.

INSERT INTO MAX(컬럼) + 1 …

하지만 많은 트랜잭션이 동시에 발생할 때 중복 에러의 가능성이 존재한다. 특정 시점에 많은 사용자가 동시에 접근해야 하는 테이블에서는 주의가 요구된다. 이런 경우 PK를 추가로 구성하여 아래와 같은 방법으로 중복 에러를 피할 수도 있다.

INSERT INTO 사용자, MAX(컬럼) + 1 …
INSERT INTO 구분코드, MAX(컬럼) + 1 …

위의 예처럼 사용자 별로 채번을 할 수도 있고 구분코드 별로 채번을 할 수도 있다. 트랜잭션이 많이 발생하지 않는다면 사용을 권한다. 경험해 본 바로는 가장 많이 사용되는 채번 방식이다.



시퀀스를 이용하는 방식

오라클 DB 사용시 시퀀스를 이용하는 방법이 있다. 오라클에서 자체적으로 지원하는 것이므로 성능이 좋으며 중복 에러나 잠금 가능성도 없다. 하지만 시퀀스도 오브젝트이므로 관리에 대한 부담이 약간 있다. 시퀀스는 읽기만 해도 증가하기 때문에 간혹 예외사항 발생시 중간 중간 빠지는 번호가 생길 수 있다.

여러 테이블에서 하나의 시퀀스를 사용할 수도 있겠지만 가능하면 하나의 테이블에 1:1 관계로 시퀀스를 생성하여 사용하길 권한다. 다른 데이터베이스에도 유사한 시퀀스 기능을 제공한다. 오라클에서 제공하는 만큼 신뢰할 수 있지만 의외로 사용하는 경우가 흔치 않다. 시퀀스 오브젝트 유실시 복구가 쉽지 않기 때문일 것이다.



채번 방식에 대한 장단점 비교

지금까지 보편적으로 사용되는 3가지 경우의 채번 방식을 설명하였다. 아래에 3가지 채번 방식에 대한 장단점을 분석한 표가 있다.

column_img_2979.jpg

[그림 2] 채번 방식에 대한 장단점 비교
오늘 연재의 내용은 채번에 대한 이해와 채번의 방식들, 이들의 장단점에 대해 알아보았다. 각각의 장단점을 고려하여 현재의 상황에 맞는 가장 적합한 방식을 선택하여 사용하면 된다. (다음 회에 계속)