postgresql的TOAST表

在 PostgreSQL 中,TOAST(The Oversized-Attribute Storage Technique)是一种处理超大数据(如大型文本字段、大型字节数组等)存储的技术。当表中的某些字段非常大,无法直接存储在一个标准 PostgreSQL 数据页中(通常是 8KB),TOAST 就会被用于管理这些超大数据。

TOAST 工作原理

TOAST 通过将超大数据分块存储到专用的 TOAST 表中,并在主表中存储一个指向 TOAST 表的指针来实现其功能。TOAST 主要通过以下方式进行优化:

  1. 压缩:首先尝试使用 PGLZ 算法压缩数据。
  2. 外部存储:如果压缩结果仍然太大,则将数据分块存储在外部的 TOAST 表中。

TOAST 表

TOAST 表是自动生成且完全透明的,用户通常无需直接与 TOAST 表交互。不过,在某些情况下,了解 TOAST 表的细节和内容可能对数据库调优和问题排查有帮助。

每个支持 TOAST 的表在数据库中都会有一个对应的 TOAST 表,该表的名称形式为 pg_toast.pg_toast_<oid>,其中 <oid> 是原始表的对象标识符。

如何识别和查看 TOAST 表

1. 查看发布规则

要查看特定表的 TOAST 表信息,您可以使用以下查询语句:

sql 复制代码
SELECT relname,
       reltoastrelid
FROM pg_class
WHERE relname = 'your_table';

reltoastrelid 字段包含 TOAST 表的 OID。

2. 获取 TOAST 表名称

使用 reltoastrelid 可以查询到实际的 TOAST 表名称:

sql 复制代码
SELECT relname
FROM pg_class
WHERE oid = (SELECT reltoastrelid
             FROM pg_class
             WHERE relname = 'your_table');
3. 查看 TOAST 表内容

要查看 TOAST 表的内容,首先获取 TOAST 表的名称,然后查询其内容:

sql 复制代码
-- 假设找到的 TOAST 表名称为 pg_toast.pg_toast_<oid>

SELECT * FROM pg_toast.pg_toast_<oid>;

TOAST 表的结构

TOAST 表包含以下列:

  • chunk_id: 原始数据行的引用 ID。
  • chunk_seq: 块的序号。
  • chunk_data: 实际的数据块。

这些列用于存储和重建原始大数据字段。

管理 TOAST 行为

您可以使用 ALTER TABLE ... SET STORAGE 语句来控制 TOAST 的行为。通过此操作,您可以更改字段的存储策略,比如将其设置为 EXTERNALMAINPLAIN,或 EXTENDED

sql 复制代码
ALTER TABLE your_table
ALTER COLUMN your_column SET STORAGE EXTERNAL;

示例

以下示例展示如何使用和管理 TOAST 表:

sql 复制代码
-- 创建一个含有大文本字段的表
CREATE TABLE example_table (
    id SERIAL PRIMARY KEY,
    large_text TEXT
);

-- 向 large_text 字段插入超大数据
INSERT INTO example_table (large_text)
VALUES (REPEAT('PostgreSQL ', 10000));

-- 查询 example_table 的 TOAST 表
SELECT relname,
       reltoastrelid
FROM pg_class
WHERE relname = 'example_table';

-- 假设 TOAST 表的 OID 为 12345,可以查询其内容
SELECT * FROM pg_toast.pg_toast_12345;

优化和调优

通过理解和使用 TOAST,您可以做出以下优化:

  1. 选择适当的存储策略:根据字段的大小和访问模式选择合适的存储策略(PLAIN, MAIN, EXTERNAL, EXTENDED)。
  2. 调整 TOAST 压缩策略 :利用 PostgreSQL 的参数 default_toast_compression,可以全局设置 TOAST 的默认压缩方式(如 pglzlz4)。
  3. 管理数据块大小 :通过调整 TOAST_TUPLE_THRESHOLD 等参数,您可以定制超大字段何时及如何被分块存储。

结论

TOAST 是 PostgreSQL 中的一个强大工具,用于管理和优化超大数据的存储。当标准数据页大小不足以存储大字段时,TOAST 通过压缩和分块外部存储来保证系统的运行效率和存储优化。

相关推荐
薛晓刚29 分钟前
当MySQL的int不够用了
数据库
SelectDB技术团队1 小时前
Apache Doris 在菜鸟的大规模湖仓业务场景落地实践
数据库·数据仓库·数据分析·apache doris·菜鸟技术
开航母的李大1 小时前
软件系统运维常见问题
运维·服务器·系统架构·运维开发
星空下的曙光1 小时前
mysql 命令语法操作篇 数据库约束有哪些 怎么使用
数据库·mysql
小楓12011 小时前
MySQL數據庫開發教學(一) 基本架構
数据库·后端·mysql
染落林间色1 小时前
达梦数据库-实时主备集群部署详解(附图文)手工搭建一主一备数据守护集群DW
数据库·sql
颜颜yan_2 小时前
企业级时序数据库选型指南:从传统架构向智能时序数据管理的转型之路
数据库·架构·时序数据库
lichenyang4532 小时前
管理项目服务器连接数据库
数据库·后端
沙振宇2 小时前
【数据库】通过‌phpMyAdmin‌管理Mysql数据
数据库·mysql
华强笔记2 小时前
Linux内存管理系统性总结
linux·运维·网络