PostgreSQL中oid与bytea存储二进制数据可否避免生成额外表?
PostgreSQL二进制数据强制行内存储方案
可以实现,你可以通过修改bytea列的TOAST存储策略来禁用行外存储,强制所有二进制数据直接保存在自定义表的指定列中,无需用到额外的存储表。
操作方法
- 默认情况下,PostgreSQL的单个数据页大小为8KB,单行总数据超过该阈值时,变长类型字段会被压缩或转储到专门的TOAST表行外存储。你需要将目标
bytea列的存储策略修改为PLAIN,即可禁用压缩和行外存储:
-- 新建表时指定策略示例 CREATE TABLE your_custom_table ( id serial PRIMARY KEY, binary_content bytea NOT NULL ); -- 修改指定列的存储策略 ALTER TABLE your_custom_table ALTER COLUMN binary_content SET STORAGE PLAIN;
- 策略生效说明:修改完成后,所有新插入、更新的
binary_content列数据都会直接存储在自定义表的主数据页中,不会产生额外的TOAST表存储。如果修改前该列已有存到TOAST表的历史数据,执行VACUUM FULL your_custom_table即可将旧数据全部迁移到主表行内。
注意事项
- 采用
PLAIN存储策略后,单行所有列的总大小不能超过8KB的默认数据页上限,超出阈值的插入/更新操作会直接报错,你需要提前评估业务中二进制数据的大小是否符合该限制。 - OID大对象方案默认会用到全局系统表
pg_largeobject存储数据,无法避免使用额外表,因此要完全实现无额外表存储二进制数据,不要使用OID大对象方案,仅使用配置了PLAIN存储策略的bytea列即可。
内容的提问来源于stack exchange,提问作者ZootHii
相关产品推荐
相关产品推荐

