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 通过压缩和分块外部存储来保证系统的运行效率和存储优化。

相关推荐
程序员shen1616113 分钟前
抖音短视频saas矩阵源码系统开发所需掌握的技术
java·前端·数据库·python·算法
夕泠爱吃糖4 分钟前
C++中如何实现序列化和反序列化?
服务器·数据库·c++
网络安全Jack15 分钟前
网络安全概论——身份认证
网络·数据库·web安全
the丶only20 分钟前
单点登录平台Casdoor搭建与使用,集成gitlab同步创建删除账号
linux·运维·服务器·docker·gitlab
alden_ygq33 分钟前
etcd网关
服务器·数据库·etcd
张声录135 分钟前
【ETCD】ETCD Leader 节点写入数据流程概览
数据库·etcd
Elastic 中国社区官方博客1 小时前
Elasticsearch:什么是查询语言?
大数据·数据库·elasticsearch·搜索引擎·oracle
ccubee1 小时前
docker 安装 ftp
运维·docker·容器
枫叶红花1 小时前
【Linux系统编程】:信号(2)——信号的产生
linux·运维·服务器
yaosheng_VALVE1 小时前
探究全金属硬密封蝶阀的奥秘-耀圣控制
运维·eclipse·自动化·pyqt·1024程序员节