database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Q&A 10499 게시물 읽기
No. 10499
파티션테이블관련 도움요청드립니다.
작성자
초보dba
작성일
2024-12-26 12:44
조회수
258

postgresql 버전 : 16


하나의 대용량 테이블을 파티션테이블로 전환계획 중입니다.


seq컬럼을 pk로 사용하고, log_dt컬럼은 파티션키로 사용하고 싶습니다.


아래와 같이 파티션테이블을 생성 후 데이터를 넣어보면

2024년1월 데이터(log_dt : 20240101)에 seq값이 1을 넣은 상태에서

2024년 2월 데이터(log_dt : 20240201)에 seq값에 1을 넣으면 데이터가 중복되어야하는데 값이 들어가고 있습니다.


global index를 사용하면 될까요? 도움부탁드립니다 ㅜ


[파티션테이블 생성]

-- 상위테이블 

create table a.test_log

( seq bigint not null,

  user_id varchar(100) not null,

  log_dt varchar(8),               -- ex. 20240101

  elapse_time varchar(100)

) partition by range(log_dt) ;


-- 하위테이블

create table a.test_log_p202401 partition of a.test_log for values from ('20240101') to ('20240201') ;

create table a.test_log_p202402 partition of a.test_log for values from ('20240201') to ('20240301') ;

                           (중략)

create table a.test_log_p202412 partition of a.test_log for values from ('20241201') to ('20250101') ;



2. pk 생성

alter table a.test_log_p202401 add primary key (seq);

alter table a.test_log_p202402 add primary key (seq);

(중략)

alter table a.test_log_p202412 add primary key (seq);


 

이 글에 대한 댓글이 총 5건 있습니다.

PostgreSQL 파티션 테이블에서는 

파티션 키가 빠진 global unique index가 불가능합니다. 

즉, 

alter table a.test_log_p202401 add primary key (seq);

이 구문이 실패할거에요. 

 

alter table a.test_log_p202401 add primary key (seq, log_dt);

로 기본키를 만들 때는 반드시 파티션 키를 포함해야합니다. 

유니크 인덱스도 마찬가지입니다.


현재로써는 윗 모델링 상태에서는 모든 테이블을 통틀어, 유일한 seq 값만 허용하겠다는 

정책은 DB 차원에서는 불가능합니다. 

AP 쪽에서 잘 구현해 주어야 합니다. 


꼼수로는 seq 만 따로 한번더 다른 일반 테이블에 저장하고 그 테이블에 기본키나 고유키를 만들어두고, 그 테이블을 파티션 테이블의 insert 트리거에서 중복된 seq 값이 입력되면 트리거 함수가 오류를 반환하면서 작업 전체가 실패되는 형태로는 구현할 수 있겠죠. 


 

김상기(ioseph)님이 2024-12-26 16:22에 작성한 댓글입니다.

도움 많이되었습니다. 감사드립니다^^

초보dba님이 2024-12-26 22:39에 작성한 댓글입니다. Edit

한가지 더 질문이 있습니다.


위와 같은 방식으로 함수, 트리거를 만들어서 해당 문제는 해결을 했는데요


이 방법을 사용할 경우, 운영환경에서 성능에는 영향도가 어떨지 궁금합니다.

초보dba님이 2024-12-27 10:33에 작성한 댓글입니다. Edit

전역 unique 를 보장하기 위한 추가 테이블의 자료가 담기는 양이 한 1억 5천 건 정도까지는 괜찮을거에요. 

그 이상 넘어 가게 된다면, 그 테이블도 자료 정리 작업을 주기적으로 해 주어야 할 겁니다. 

한테이블에 자료를 무한정 보관할 수는 없거든요. 

PostgreSQL 특징인 트랜잭션 ID 겹침 방지 작업을 vacuum이 하는데, 자료가 끊임 없이 한 테이블에 쌓이게 된다면, 자료가 많아질 수록 문제가 생기기 마련입니다. 


이 전역 unique 자료가 수십억건이 넘어갈 예정이라면, 모델링을 다시 고민하셔야 할 것 같습니다. 

 

김상기(ioseph)님이 2024-12-27 17:55에 작성한 댓글입니다.

넵 도움많이 되었습니다. 감사드립니다^^

초보dba님이 2024-12-30 13:47에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
10507db collate, ctype 변경가능 여부 문의드립니다. [1]
voicek
2025-01-16
170
10503파티션테이블 인덱스 관련 문의드립니다. [3]
초보dba
2025-01-08
194
10500시퀀스 생성관련 문의드립니다. [2]
초보dba
2024-12-30
229
10499파티션테이블관련 도움요청드립니다. [5]
초보dba
2024-12-26
258
10498cmd postgresql upgrade 방법 [1]
최다니엘
2024-12-21
213
10497신규 계정생성 후 모든 딕셔너리 조회는 별도 권한없이 조회가 가능한가요? [1]
pgdba
2024-12-18
232
10496심볼릭 링크를 사용하는 postgresql 저장공간 변경 [2]
전성용
2024-12-09
255
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2025 DSN, All rights reserved.
작업시간: 0.011초, 이곳 서비스는
	PostgreSQL v17.4로 자료를 관리합니다