025. 시퀀스 객체, IDENTITY 필드, 채번 테이블 - llighter/database GitHub Wiki
"모두 최대한 사용하지 않기"
1. 시퀀스 객체
'객체'라는 용어에서 알 수 있듯이 테이블 또는 뷰처럼 스키마 내부에존재하는 객체 중 하나이다.
-- 시퀀스 객체 정의 예
CREATE SEQUENCE testseq
START WITH 1
INCREMENT BY 1
MAXVALUE 100000
MINVALUE 1
CYCLE;
이 기능이 가장 자주 사용되는 장소는 바로 INSERT
구문 내부이다.
-- 시퀀스 객체를 사용한 레코드 INSERT 구문
INSERT INTO HogeTbl VALUES(NEXT VALUE FOR nextval, 'a', 'b', ...);
- 시퀀스 객체의 문제점
- 표준화가 늦어서, 구현에 따라 구문이 달라 이식성이 없고, 사용할 수 없는 구현도 있다.
- 시스템에서 자동으로 생성되는 값이므로 실제 엔티티 속성이 아니다.
- 성능적인 문제를 일으킨다.
실제 1, 2번 문제의 경우 실무에서 무시하고 사용하지만 3번은 잘 살펴봐야 한다.
- 시퀀스 객체로 발생하는 성능 문제
시퀀스 객체의 로직에 의존하는 문제
시퀀스 객체가 생성하는 순번의 세 가지 특성
- 유일성
1,2,2,3,4,5,5,5 // 중복 값이 발생해서는 안된다.
- 연속성
1.2.4.5.6.8 // 3, 7이 비어있다.
- 순서성
1,2,5,4,6,7,8 // 4와 5의 대소 관계가 역전되어 있다.
시퀀스 객체는 기본 설정에서 이러한 세 가지 성질을 모두만족하는 순번을 생성한다. 따라서 동시 실행 제어를 위한 락(rock) 메커니즘이 필요하다. 사용자 A가 시퀀스 객체에서 NEXT VALUE
를 검색할 때의 처리를 간단히 살펴보자.
- 시퀀스 객체에 배타 락을 적용
NEXT VALUE
를 검색CURRENT VALUE
를 1만큼 증가- 시퀀스 객체에 베타 락을 해제
1 ~ 4의 단계 사이에 다른 사용자는 시퀀스 객체에 접근할 수 없다. 따라서 동시에 여러 사용자가 시퀀스 객체에 접근하는 경우 락 충돌로 인해 성능 저하 문제가 발생한다. 또한 어떤 사용자가 연속적으로 시퀀스 객체를 사용하는 경우에도 1,4 단계를 반복하므로 오버 헤드가 발생한다.
- 시퀀스 객체로 발생하는 성능 문제의 대처
CACHE
와 NOORDER
객체
CACHE
는 새로운 값이 필요할 때마다 메모리에 읽어들일 피룡가 있는 값의 수를 설정하는 옵션이다.NOORDER
옵션은 순서성을 담보하지 않아서 오버 헤드를 줄이는 효과가 있다.
- 순번을 키로 사용할 때의 성능 문제
순번처럼 비슷한 데이터를 연속적으로 INSERT
하면 물리적으로 같은 영역에 저장된다. 이때 저장소의 특정 물리적 블록에만 I/O 부하가 커지므로 성능 악화가 발생한다. 이렇게 I/O 부하가 몰리는 부분을 '핫 스팟(Hot Spot)` 또는 '핫 블록(Hot Block)' 이라고 부른다.
- 순번을 키로 사용할 떄의 성능 문제에 대처
- Oracle의 역 키 인덱스처럼, 연속된 값을 도입하는 경우라도 DBMS 내부에서 변화를 주어 제대로 분산할 수 있는 구조(일종의 해시)를 사용한다.
INSERT
의 성능향상이 있으나 범위 검색 등에서 I/O양이 늘어나SELECT
구문의 성능이 나빠질 위험이 있다.
- 인덱스에 일부러 복잡한 필드를 추가해서 데이터의 분산도를 높이는 방법이 있다.
- 논리적 차원에서 좋은 설계가 아니다.
이와 같이 시퀀스 객체를 사용했을 때의 성능 문제는 (물리 계층에서 발생한다는 점에서) 굉장히 뿌리 깊은 문제이다. 따라서 시퀀스 객체는 최대한 사용하지 말아야 하며, 사용한다면 어떤 위험이 있는지 확실하게 인지해야 한다는 것이 결론이다.
2. IDENTITY 필드
'자동 순번 필드' 라고도 한다.
IDENTITY
필드는 기능적, 성능적 측면에서 시퀀스 객체보다 삼각한 문제를 가진다.
- 특정 테이블과 연결된다.
CACHE
와NOORDER
을 사용할 수 없거나 제한적이다.
3. 채번 테이블
순번을 생성하는 전용 테이블
채번 테이블을 사용하는 구시대의 유물과 같은 시스템을 유지보수해야 한다면, 그 부분에서 바틀 넥(Bottle Neck)이 걸리지 않기를 기도해야 한다. 왜냐하면 바틀 넥이 걸려도 튜닝할 수 있는 방법이 전혀 없다.