Backend
home

MSSQL Identity Jump 1000 ( 자동증가 컬럼 )

생성 일시
2025/03/07 15:31
태그
MSSQL
게시일
2025/03/08
최종 편집 일시
2025/03/07 15:52

Identity Jump 1000

MSSQL 을 사용하는 과정에서 테이블의 속성 중 Identity (1, 1)으로 컬럼을 만드는 경우가 많다. 1에서 시작하여 1씩 증가하도록 만들어 데이터가 쌓이는 순서대로 채번을 한다.
그런데 며칠 전에 생성한 테이블에서 데이터를 Insert 했는데 컬럼의 번호가 1000씩 건너뛰는 이슈를 확인했다.
알고보니 MSSQL 2012 이상부터 SQL Service가 재시작되는 경우 컬럼의 번호가 1000씩 건너띄는 경우가 있다는 것을 확인할 수 있었다. 사실 현재 MacOS 를 사용 중인데 Docker를 통해 MS SQL을 활용 중이다. Docker Desktop을 확인해보니 MS SQL Server가 중단되어 있었다. 재시작 후 데이터를 추가하는 과정에서 컬럼의 번호가 1002, 1003으로 증가된 것이다.

Jump 1000 현상이 문제일까?

이 블로그를 통해 몇 가지 내용을 확인할 수 있었다.
원래 Identity 속성으로 컬럼을 지정하는 이유는 데이터가 쌓이는 순서대로 번호가 생기고 중복이 발생하지 않게 하기 위함이다. 그래서 반드시 1, 2, 3, 4, 5 이렇게 숫자가 빠짐없이 생기는 것을 보장하지 않는 것이 기본이다.
예컨대 begin tran으로 트랜잭션을 오픈하고 데이터를 넣을 경우 1, 2, 3, 4 채번을 하고 대기 중에 있다. 동시에 다른 세션에서 트랜잭션을 오픈하지 않은 상태로 데이터를 1건 넣는다고 하면 6번으로 채번이 된다. 만약 이전에 begin tran으로 트랜잭션을 오픈하고 1부터 5번까지 넣었던 데이터를 롤백한다면 결국 데이터는 6부터시작하는 데이터만 남게 된다. 이 경우와 같이 반드시 1, 2, 3, 4, 5, 6, 7 처럼 중간에 숫자를 빠짐없이 채우는 기능은 Identity에서 제공하지 않음을 알 수 있다.
그렇기 때문에 SQL Service가 재시작 된 이후에 Identity 값이 1000을 jump 한다고 문제될 일은 없다.

그래도 Jump 1000을 하고 싶지 않다면?

데이터베이스 수준에서 IDENTITY CACHE 옵션을 비활성화 하면 된다.
이 부분은 데이터베이스 수준에서 설정하는 것이기 때문에 고려하여 적용해야 한다.
ALTER DATABASE SCOPED CONFIGURATION SET IDENTITY_CACHE = OFF
SQL
복사

참고

데이터베이스 수준에서 ID 캐시를 사용하거나 사용하지 않도록 설정한다. 기본값은 ON이다. ID 캐싱은 ID 열이 있는 테이블에서 INSERT 성능을 개선하기 위해 사용된다. 서버가 예기치 않게 다시 시작하거나 보조 서버로 장애 조치(failover)되는 경우에 ID 열의 값이 차이 나지 않도록 IDENTITY_CACHE 옵션을 비활성화한다. 이 옵션은 서버 수준에서만이 아니라 데이터베이스 수준에서 설정될 수 있다는 점을 제외하고 기존 추적 플래그 272와 비슷하다