개요: 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 시퀀스로 사용될 수 없음.
'PostgreSQL' 카테고리의 다른 글
PostgreSQL의 통계 제공 view들 (0) | 2023.09.17 |
---|---|
PostgreSQL 병렬 처리 (0) | 2023.09.17 |
Aurora PostgreSQL orphaned file 발생 관련 정리 (0) | 2023.07.27 |
PostgreSQL에서의 ALTER TABLE 구문 정리 (0) | 2023.07.26 |