본문 바로가기

DataBase/MS-SQL

MSSQL [@@IDENTITY, SCOPE_IDENTITY, IDENT_CURRENT]

반응형

출처 : http://mcpicdtl.blogspot.com/2009/12/mssql-identity-scopeidentity.html

 

@@IDENTITY

--> @@의 의미는 세션을 뜻한다 즉 해당 세션에서 테이블에 INSERT된 최종값을 의미한다

어느 정도의 부하가 있는 시스템에선 사용가능하나 멀티스레팅이 구현된 환경에서는 

원하는 최종값이 아닌 엉뚱한 값이 들어갈 확률이 높다

해당 테이블에 대한 여러 접속자가 값을 반영하고 있는 경우 사용하면 안된다. 

싱글 스레드 전용(중규모 사이트 용)


IDENT_CURRENT('테이블명')

--> 함수에서 알수 있듯이 세션에 상관 없이 해당 테이블에 대한 최종값 또는 들어갈 값을 의미한다

다른 IDENTITY와 다르게 데이터 입력전에 그 값을 알 수 있다 

하지만 테이블 전체에 대한 값을 의미 하므로 1인용 시스템에 적합하다.

VB로 개인용 비디오 관리 시스템 같은거 이왼 쓰면 안된다.

즉 실시간으로 IDENTITY를 알아야 환경에서는 이런 함수는 없다고 생각하는 편이 낳다.

하지만 필요할 때가 있는데 실시간 통계등 어떤 고정된 시간을 두고 데이터를 추측해야 하는 시스템

예를 들면 실시간 광고시스템에서 1분 단위의 디피에 들어온 큐수치를 계산하고 싶을 경우 

1분에 해당하는 레코드수를 구하기 위해서 COUNT를 하는 것은 매우 비효율적이다 

즉 현재 테이블의 IDENTITY를 테이블 단위로 정확히 숫자를 가져오고 그 전값에서 

차감하면 실시간 통계 계산에 편리해 진다.

바로 이럴때 사용하는 것이 IDENT_CURRENT('테이블') 함수이다.


SCOPE_IDENTITY()

--> 마지막으로 해당 프로세스 + 해당 세션의 최종 IDENTITY를 가져오고자 할때 필요하다 

주로 대규모 사이트나 멀티스레드 환경에서 많이 쓰인다 

예를 들어 이 함수가 실행되는 곳이 SP이거나 FN이거나 TRRIGER일수도 있다 

그렇다면 해당 프로세스+세션으로 제한을 걸고 IDENTITY를 가져오기 때문에 

실시간 키코드를 리턴해야 하는 상황에선 가장 신뢰할 수 있는 함수가 된다



비교하는 차원에서 오라클과 MYSQL을 보자면 


오라클에선 IDENTITY라는 개념 보다 시퀀스라는 개념을 사용한다 

일종에 자동증분 전용 테이블이라고 생각하면 되는데 

생성은 CREATE SEQUENCE ..... 로 시작한다 

시작값과 증가값 그리고 마지막 값을 지정할 수 있고 

그 마지막 값에 도달했을때 1부터 다시 발행할지 아닐지 정할 수 있다

이외 자동키값 반환의 ROWID 같은 것들이 있으나 별로 권장하고 싶지는 않다 

오라클의 경우 시퀀스라는 개념에 최적화 되어 있기 때문에 테이블을 생성할때 

자동증분값이 필요하다면 항상 시퀀스고 같이 CREATE해야 한다 

귀찮을 수 있지만 멀티스레드이든 싱글스레드이건 부정확한 값이 담기는 부작용이 없다

시퀀스의 이름이 CREATE SEQUENCE NEWKEY .... 라고 할때 이름은 NEWKEY가 되고 

현제 시퀀스 : NEWKEY.CURRVAL

다음 시퀀스 : NEWKEY.NEXTVAL 이 된다

더 상세한 설명은 검색해 보길 바란다. 



마지막으로 MYSQL이다 


LAST_INSERT_ID() 함수를 제공한다 MSSQL에 비하면 @@IDENTITY 같은 개념이다 

그 이외 추가적인 설명은 필요 하지 않다

반응형