postgres$ cd /home/postgres
postgres$ mkdir ts_dir
=> CREATE TABLESPACE ts LOCATION '/home/postgres/ts_dir';
CREATE TABLESPACE
=> CREATE DATABASE data_lowlevel;
CREATE DATABASE
=> \c data_lowlevel
You are now connected to database "data_lowlevel" as user "postgres".
=> CREATE UNLOGGED TABLE u(n integer) TABLESPACE ts;
CREATE TABLE
=> SELECT pg_relation_filepath('u');
pg_relation_filepath --------------------------------------------- pg_tblspc/16423/PG_10_201707211/16424/16425 (1 row)
=> \! ls -l /usr/local/pgsql/data/pg_tblspc/16423/PG_10_201707211/16424/16425*
-rw------- 1 postgres postgres 0 мар 31 15:24 /usr/local/pgsql/data/pg_tblspc/16423/PG_10_201707211/16424/16425 -rw------- 1 postgres postgres 0 мар 31 15:24 /usr/local/pgsql/data/pg_tblspc/16423/PG_10_201707211/16424/16425_init
=> DROP TABLE u;
DROP TABLE
=> DROP TABLESPACE ts;
DROP TABLESPACE
=> CREATE TABLE t(s text);
CREATE TABLE
=> \d+ t
Table "public.t" Column | Type | Collation | Nullable | Default | Storage | Stats target | Description --------+------+-----------+----------+---------+----------+--------------+------------- s | text | | | | extended | |
По умолчанию для типа text используется стратегия extended.
=> ALTER TABLE t ALTER COLUMN s SET STORAGE external;
ALTER TABLE
=> INSERT INTO t(s) VALUES ('Короткая строка.');
INSERT 0 1
=> INSERT INTO t(s) VALUES (repeat('A',3456));
INSERT 0 1
=> SELECT relname FROM pg_class WHERE OID = ( SELECT reltoastrelid FROM pg_class WHERE relname='t' );
relname ---------------- pg_toast_16428 (1 row)
TOAST-таблица "спрятана", так как находится в схеме, которой нет в пути. И это правильно, поскольку TOAST работает прозрачно для пользователя. Но заглянуть в нее все-таки можно:
=> SELECT chunk_id, chunk_seq, length(chunk_data) FROM pg_toast.pg_toast_16428 ORDER BY chunk_id, chunk_seq;
chunk_id | chunk_seq | length ----------+-----------+-------- 16434 | 0 | 2000 16434 | 1 | 1456 (2 rows)
Видно, что в TOAST-таблицу попала только длинная строчка (два фрагмента, общий размер совпадает с длиной строки). Короткая строчка не вынесена в TOAST просто потому, что в этом нет необходимости - версия строки и без этого помещается в страницу.