CUBRID와 Oracle의 serial(sequence) 객체의 사용 차이점

 
Serial(sequence)이란?

고유의 순번(유일한 값)을 생성하는 객체이며, 아래와 같은 특성을 갖는다.

- 다중 사용자 환경에서 고유한 순번을 생성하는데 용이하다.

- 테이블과 독립적으로 생성되므로 하나 이상의 테이블에 동일한 시리얼을 사용할 수 있다.

- 모든 사용자가 serial객체를 생성할 수 있다.

- serial객체의 소유자와 dba만 객체를 갱신하고 삭제할 수 있다.

☞ CUBRID의 Serial과 Oracle의 Sequence의 정의는 동일하다.

 

Serial(Sequence)생성 문법

create serial serial_name

start with n

increment by n

nomaxvalue

nominvalue

nocycle

nocache

serialsequence로 변경해 주면 생성 방법은 동일하다. 각 옵션에 대한 설명은 큐브리드 홈페이지의 온라인 메뉴얼을 참조하기 바란다.


CUBRID의 Serial과 Oracle의 sequence의 차이점은?

CUBRID의 Serial

- Serial을 생성하면 최초의 값을 가지고 있어 next_value를 부르지 않고 바로 current_value 불러올 수 있다.

- Serial의 최종 값을 가져오게 되므로 여러 session을 사용한 경우에도 current_value값은 모든 session에서 동일하다. 따라서 해당 session의 current_value가 '5'였더라도 다른 session에서 next_value에 의해 증가했다면 다음 current_value에서는 증가한 값으로 나오게 된다.

Oracle의 Sequence

- 새로운 session에서 nextval을 수행하기 전에 currval을 가져올 수 없다. 따라서 session 생성 후 currval을 이용할 수 없다.

- Session 단위로 currval의 값을 유지한다. 따라서 해당 session에서의 현재 값이 '5'라면 다른 session에서 nextval에 의해 계속적으로 증가한다고 하더라도 currval '5'를 유지한다. 해당 session에서 nextval을 수행하면 타 session의 currval의 다음 값으로 이동한다.


Serial과 Sequence의 사용 차이점의 예


CUBRID

CUBRID1.JPGCUBRID2.JPG

☞ 좌측 최상단의 쿼리가 첫번째 수행 쿼리, 우측 상단의 쿼리가 두번째 쿼리, 좌측 하단이 세번째 쿼리로 현재값을 확인한 것이며, 우측 하단의 네번째 쿼리도 현재값을 확인한 값이다. 좌측과 우측은 다른 session의 창이다. 위의 결과로 보아 다른 session이라도 serial의 current_value를 공유한다는 것을 알 수 있다.

위의 상태에서 netx_value수행 할 경우 각 session에서는 바로 다음 값이 나오는 것을 확인 할 수 있다. 그 결과는 아래와 같다.

CUBRID3.JPG

양쪽 어떤 session에서 위의 SQL을 수행하더라도 최족 값을 기준으로 증가하게 된다. current_value를 공유한다는 것을 확인할 수 있다.

 

Oracle

Oracle1.JPG Oracle2.JPG

☞ 좌측 최상단의 쿼리가 첫번째 수행 쿼리, 우측 상단의 쿼리가 두번째 쿼리, 좌측 하단이 세번째 쿼리로 현재값을 확인한 것이며, 우측 하단의 네번째 쿼리도 현재값을 확인한 값이다. 좌측과 우측은 다른 session의 창이다. 위의 결과에 따르면 좌측 session의 currval과 우측 session의 currval이 다른 것을 알 수 있다. 이는 각 session의 currval이 독립적인 상태라는 것을 알 수 있다.

위의 상태에서 nextval을 호출 하면 좌측 session에서는 아래와 같은 결과 값이 나오게 된다.

Oracle3.JPG

☞ 좌측 session의 currval은 28이었으나 우측 session에서 증가를 시켰으므로 nextval은 30으로 결과 값이 나오게 된다. 이는 각 session이 독립되어 있는 상태로 한 session에서의 currval은 해당 session에서 nextval을 불러오지 않는 그 session에서 조회한 curral을 계속 가지고 있을 것이다.


결과에 따른 개발 시 주의 사항

- Oracle에서 개발할 경우 하나의 session에서의 current값은 변동이 없으므로 nextval을 부르고 차후 currval을 불러서 사용하는 응용프로그램을 만드는 경우가 있다. Multi User환경에서는 이러한 형식을 CUBRID에 그대로 적용할 경우 원하는 currval(CUBRID에서는 current_value)를 가져올 수가 없는 것이다. session마다 독립적으로 current_value값을 가지고 있지 않기 때문에 하나의 session에서 불러낸 next_value를 해당 session에서 current_value로 사용할 수 없을 것이기 때문이다.

- CUBRID의 current_value는 next_value 호출 없이 새로운 session에서 사용이 가능하다. serial테이블에 저장되어 있는 현재 값을 가져오기 때문이다. 따라서 session 시간 시 바로 current_value를 가져올 수 있어, 이를 이용하면 된다.