본문 바로가기

PostgreSQL

PostgreSQL Table types

SYNTAX

CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name (
~~ 중략 ~~
)
[ INHERITS ( parent_table [, ... ] ) ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]

PERMANENT

일반적인 테이블입니다.

TEMPORARY or TEMP

CREATE TABLE 시 위 옵션을 지정하면 임시테이블이 생성됩니다.

해당 테이블은 세션의 종료, 혹은 tx 의 종료 때 자동으로 drop 됩니다.

TEMP 테이블은 AUTOVACUUM Daemon 의 대상이 되지 않기에, 복잡한 쿼리에 이 테이블이 사용되는 경우

Analyze 를 통해 수동으로 통계를 수집하는 방법을 사용할 수 있습니다.

ON COMMIT

TEMP TABLE 의 TX 종료 시점의 동작을 정의할 수 있습니다.

사용할 수 있는 옵션은 다음과 같습니다.

  • PRESERVE ROWS
  • DELETE ROWS ( = TRUNCATE )
  • DROP

on commit 절을 생략하는 경우 기본 동작은 PRESERVE ROWS 입니다.

세션이 종료되면 사용했던 테이블은 삭제됩니다.

UNLOGGED

해당 옵션이 CREATE TABLE 시 사용되는 경우 로깅하지 않는 테이블이 생성됩니다. 

해당 테이블에 대해 수행되는 DML 은 PERMANENT TABLE 과 비교하여 더 빠릅니다.

해당 테이블에 대한 오퍼레이션은 WAL 에 쓰여지지 않으며, 비정상적인 종료에 대해 데이터를 보장하지 않습니다.

더불어 WAL 에 쓰여지지 않기 때문에 Standby servers 에도 복제되지 않습니다.

인스턴스가 다운되거나 unclean shutdown 되는 경우 해당 테이블은 자동으로 truncate 됩니다.

INHERITS

Partitioned-table 을 만들기 위해 사용하는 옵션입니다.

INHERITS ( parent_table ) 지정을 하게 되고, Child 는 Parent table 과 동일한 컬럼, 데이터 타입, 제약조건을 가져야 합니다.

Parent 테이블에 대한 변경은 Child table 에 전파됩니다.

ETC

PostgreSQL 에서는 ORACLE 의 Temporary table 과 같은 오브젝트는 없습니다.

오라클의 temp table 의 경우는 TX 의 종료와 함께 truncated 되고 테이블의 메타데이타는 세션이 종료되어도 남아있습니다.

PostgreSQL 의 경우에는 세션이 종료되면 on commit 의 내용과 상관없이 테이블 메타데이타도 삭제 ( drop ) 됩니다.

on commit drop 옵션을 통해 세션 종료 전에 삭제하냐 종료 후에 삭제하냐 정도의 차이만 있습니다.

이를 통해 PostgreSQL 의 방향성을 추측하자면 "DBMS 에 임시성 오브젝트는 남겨두지 않는다" 가 아닌가 싶습니다.