본문 바로가기

PostgreSQL

PostgreSQL 시퀀스 정리

개요: PostgreSQL의 시퀀스 사용방법 및 권장안을 정리한 글입니다.

         Oracle과의 차이점 및 cache 동작 방식을 이해하여 보다 적절한 cache 값 설정,

         개발하는 데에 필요한 현재 last_value 확인 방법 등을 서술합니다.

 


관련된 함수 정리

 

  • 예시
-- 현재 값 확인, 다만 해당 시퀀스가 해당 세션에서 사용되었어야지만 확인 가능 

-- 사용 권한 없는 경우 하단의 방식으로 확인 가능. 
currval('delivery_tip_id_seq'); 

-- 해당 sequence의 insert 권한 필요 
nextval('delivery_tip_id_seq'); 
setval('delivery_tip_id_seq',1000); 
setval('delivery_tip_id_seq',1000,true);

 

  • **특정 시퀀스 select 권한만 가진 유저가 last_value를 확인하고 싶은 경우**
la_tms=> select last_value from corrected_coordinate_id_seq; 

last_value 
------------     
189710 (1 row)

 

시퀀스 관련 함수 권한 정리

currval(): SELECT 혹은 USAGE 권한 부여 필요

nextval(): UPDATE 혹은 USAGE 권한 부여 필요

setval(): UPDATE 권한 부여 필요

SELECT setval('myseq', 42);          
-- 다음 nextval이 43 리턴 

SELECT setval('myseq', 42, true);    
-- 위와 동일 

SELECT setval('myseq', 42, false);   
-- 다음 nextval이 42 리턴

 

  • 권한 확인 예시
la_tms=> \dp+ delivery_tip_id_seq*
Access privileges
 Schema |        Name         |   Type   |     Access privileges     | Column privileges | Policies 
--------+---------------------+----------+---------------------------+-------------------+----------
  public | delivery_tip_id_seq | sequence | latms_user=rwU/latms_user+|                   | 
         |                     |          | kurly_user=r/latms_user   |                   | 
(1 row)

 

Cache 동작방식 관련

  • 오라클과 비교하였을 때 cache값이 성능에 큰 영향을 주지는 않는 것으로 확인되었음.
  • 가급적 cache값을 기본값인 1로 설정하는 것으로 권장.
  • 다만, cache값을 크게 주었을 때 성능 개선이 없지는 않음.
  • 세션 레벨로 sequence cache가 동작하기 때문에, cache를 10으로 설정한 경우 세션1에서는 1로 시작하고 세션2에서는 11부터 시작하게 되는 방식으로 오라클과 동작방식이 다름.
  • 동시성 제공을 위해 nextval 작업은 rollback이 없으며 그로 인해 한번 fetch된 값은 다시 return되지 않음. PostgreSQL 시퀀스는 gapless 시퀀스로 사용될 수 없음.