본문 바로가기

PostgreSQL

PostgreSQL Toast에 관한 정리

해당 글은 PG 11 기준으로 작성되었습니다.

Toast(The Oversized-Attribute Storage Technique)

정의: Toast는 크기가 고정되지 않는 타입의 Column 에 적용되는 기술로, 보다 큰 column 사이즈를 지원하기 위해 값을 압축/분할하여 별도의 pg_toast에 각각의 row로 담아 관리하는 기술이다.

fixed page size (commonly 8 kB) 보다 큰 경우에 적용된다.

- toast 관련하여 4가지 모드가 있으며, 모드들은 압축 유/무 분할 유/무 에 관련된 내용들이 있다.

- PostgreSQL 11버전 기준으로 toast 관련된 table space를 별도로 지정하는 기능은 없다.
(오라클에는 lob column을 별도의 테이블 스페이스로 지정 가능한 것과 대비된다.)

- 테이블 스페이스 사용하고 text 데이터를 생성하여 toast 테이블 사용하였을 시에 해당 테이블 스페이스에 공간이 늘어나는 것을 확인하였다.

toast table 사용되게 생성 및 확인 관련 쿼리

promdb=# CREATE table t1_toast(message text);
 ##### 테이블 toast 생성#####

 promdb=# INSERT INTO t1_toast
 SELECT (SELECT
    string_agg(chr(floor(random() * 26)::int + 65), '')
     FROM generate_series(1,10000))
 FROM generate_series(1,10);
 ##### 테이블 toast에 row 생성#####

 promdb=# SELECT reltoastrelid::regclass
    FROM pg_class
WHERE relname = 't1_toast';
   reltoastrelid
 -------------------------
 pg_toast.pg_toast_41120
 ##### 테이블 toast의 message row을 압축/분할해서 담고 있는 테이블 명 조회 #####

 promdb-#  SELECT pg pg_toast.pg_toast_41120;
 ##### 압축/분할되어 있는 테이블 내용확인 #####

 

특정 column toast 모드 변경하기(alter table set storage)

alter table t1_toast alter column column_name set storage EXTENDED;

 

량순으로 table 정렬해서 top 20개 보기

SELECT nspname || '.' || relname AS "relation",
    pg_size_pretty(pg_relation_size(C.oid)) AS "size"
  FROM pg_class C
  LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
  WHERE nspname NOT IN ('pg_catalog', 'information_schema')
  ORDER BY pg_relation_size(C.oid) DESC
  LIMIT 20;

 

해당하는 테이블에 연결된 toast 테이블 이름 찾기

select relname from pg_class where oid = (select  reltoastrelid from pg_class where relname='<t1_toast>');

 

 

'PostgreSQL' 카테고리의 다른 글

bloat postgresql check query  (0) 2021.07.18
PostgreSQL에 oracle_fdw 설정하기- 2/2  (0) 2021.01.20
PostgreSQL에 oracle_fdw 설정하기- 1/2  (0) 2021.01.20
PostgreSQL 13(1편 Index size)  (0) 2020.09.27