blog.stackframe.dev

UNLOGGED 테이블

PostgreSQL에는 MySQL, MariaDB의 MEMORY 스토리지 엔진 같은 기능이 존재하지 않는다. 그래서 캐싱이나 임시 데이터 저장 용도로 PostgreSQL을 사용하면 오버헤드가 꽤 있다.

그래도 다른 프로그램을 설치하고 싶지 않고 PostgreSQL로 처리하고 싶은 사람들을 위해 오버헤드를 조금이나마 덜 수 있는 UNLOGGED라는 옵션이 존재한다. 이게 켜진 테이블은 테이블 데이터 변경사항을 WAL(write-ahead log)에 기록하지 않는다. 참고로 WAL은 변경사항이 데이터 파일에 기록되기 전에 먼저 쓰여져서 PostgreSQL이 갑작스럽게 종료되었을 때 이 로그를 이용해서 복구한다. 그러므로 데이터 파일 변경을 일으키는 DML(INSERT, DELETE, UPDATE)명령이 더 빠르게 수행된다. SELECT는 데이터 변경을 일으키지 않으므로 빨라지지 않는다. 이걸 빠르게 하려면 인덱스를 잘 설정하자.

물론 장점이 생기는 대신 단점도 생긴다. WAL을 기록하지 않기 때문에 PostgreSQL이 크래시된다거나 컴퓨터의 전원을 바로 내려버리는 등 안전하게 종료하지 않으면 데이터가 제대로 저장되었는지 확인과 복구가 불가능하기에 아예 테이블을 TRUNCATE 시켜버린다. 그러므로 사라져도 문제없는 데이터를 저장하는 용도로 UNLOGGED 테이블을 사용해야 한다. 또 PostgreSQL 고가용성을 위한 Streaming Replication 같은 WAL을 사용하는 기능에는 사용할 수 없다. 정확히는 UNLOGGED 테이블은 Streaming Replication을 설정하여도 전달 될 데이터가 없기 때문에 복제되지 않는다.

테이블 생성 시에 UNLOGGED로 설정하는 SQL은 아래와 같다:

CREATE UNLOGGED TABLE table_name ...;

이미 생성된 테이블을 UNLOGGED로 변경하는 SQL은 아래와 같다:

ALTER TABLE table_name SET UNLOGGED;

나는 웹 세션 관리에 UNLOGGED 테이블을 활용하고 있다. 파일로 관리하려면 확장에도 걸림돌이 되고 동일 세션이 동시에 접속하게 되면 락을 걸고 임계영역으로 처리해야 하는데 이건 데이터베이스에 맡기는게 더 편했기 때문이다.

댓글