본문 바로가기

DB/MS SQL Server

MS SQL Server 2012에서 생긴 Sequence 써야할까?

MS SQL Server 2012에 시퀀스가 추가 되었다.

오라클이나 PostgreSQL에서는 자동증가 컬럼을 위한 객체로 시퀀스라는 것을 가지고 있다.

MS SQL에는 Identity를 가지고 있어서 자동증가 필드로 지정이 가능하다.


이것에 대한 일반적인 사항은 '엑셈(EXEM)의 기술백서'에서 잘 다루고 있으니 참고하면 될 것 같고

wh-sqlserver_Identify_Sequence.pdf


궁금한 점은 Identity가 Sequence에 비해 동시성 문제가 발생할 가능성이 있느냐는 것이다.

우리 부서의 전직 오라클 DBA를 했던 분은 대량의 데이터를 넣는 테이블에 자동증가컬럼을 사용할 경우 최종 값을 찾기 위해서 계속 검색을 해야 하기 때문에 검색하는 동안에 LOCK이 발생한다고 알고 있었다.


좀 오래되었지만 SQL Server 2005 시대(2006년 4월) 작성된 'SQL Server Identity column FAQs'라는 글에는 SQL Server의 내부적으로 동기화 매커니즘을 스핀락(대략적으로 말해서 Interlocked 함수)의 경량의 동기화 방법을 새용해서 인-메모리로 관리한다고 되어있었다.

문제는 롤백이 발생되어져야 할 상황이 있을 수 있는데 이런 경우 레코드 로그(log recorde)에 관련된 값에 대한 추적을 하여 가능하게 한다는데 이 때 lock이 발생할 수 있다는 것이다.

이와 같은 내용은 'Should I Use IDENTITY or Not?'라는 SQL Server Pro 에서도 유사한 글이 있다.


Jennifer라는 사람이 문의한 'Adding Identity Column to BIG table'라는 글에서 보면 3천 6백만 레코드 이상의 테이블을 가지고 있는데 log 파일들이 lock이 걸리는데 해결방법을 문의 하고 있다.


세 가지 글에 대해 언급을 했는데 log에 대한 LOCK에 대한 언급이 있는 걸로 보아 어느정도 관련이 있지 않나 생각이 드는데,
역시 확실한 것은 실제로 테스트를 해보는 방법 뿐이라고 생각이 든다.