跳转至

什么是 Postgres TOAST?

因为 PostgreSQLtuple(行数据)是存在在 Page 中的,Page 的大小默认为 8KB。postgresql 不允许 tuple 跨页存储,所以当一行数据的某个列数据过大时,比如 text 类型的数据,超过了单页的大小,那么 postgresql 会将它压缩,切分,并且存储在另外的位置。这种技术就是称为 Toast。

PostgreSQL Toast 是通过单个字段的大小来进行判断是否触发此机制的,比如一个字段,超过了toast_tuple_threshold 的阈值就会触发字段里面的值,要进行 TOAST 的工作流程,默认这个字段的值,大小要超过 2KB,才会触发。

Postgres 的存储单位称为页,它们具有固定大小(默认为 8 kB)。固定页面大小为 Postgres 带来了许多优势,即数据管理简单、高效和一致性,但它也有一个缺点:某些数据值可能不适合该页面。

INSERT INTO post_toast (long_text, large_varchar, json_data, other_column)
VALUES
('Short text', 'Short varchar', '{"key": "value"}', 1);



INSERT INTO post_toast (long_text, large_varchar, json_data, other_column)
VALUES 
(
 repeat('This is a long text. ', 200),               
 repeat('A large varchar field. ', 200),            
 '{"nested_key": {"sub_key": "large_value"}}',      
    2
);