PostgreSQL - 行中的大文本 - 更新或插入和删除 - 最好恢复空间/提高性能

use*_*052 1 sql postgresql performance

我有一个postgres数据库作为应用程序的一部分,当前文本字段填充了大约300K的文本.

表中大约有3列可以常规填充这些信息.这导致表格超过一个大约100行的演出.我想删除那些列中的数据而不删除行中的其他信息 - 我的问题是,如果我做更新集columns =''比插入select更好,我只是选择了我需要的行,然后删除现有的行.它是第三方应用程序,因此此时无法重写它们存储数据的方式.

Erw*_*ter 5

首先,对于3列~300k文本,表格的大小不应超过1 GB,只有100行.你有autovacuum吗?或者你经常吸尘吗?请阅读手册中的真空.检查您的设置.

关于UPDATE与INSERT/DELETE的问题:由于PostgreSQL的MVCC模型,每个UPDATE实际上都是一个新的INSERT.旧排将被保留并最终通过真空清除.使用UPDATE,它更简单.恢复空间/性能的关键是吸尘.

还有相关的命令CLUSTER.重写整个表和所有索引的完美状态.节拍VACUUM FULL,因为它实际上也是一个REINDEX.您可以尝试一次,以查看没有死元组的表的实际大小.

关于性能:PostgreSQL将大列的(压缩)内容写入TOAST表.因此,无论列的大小是30k还是30MB,标准查询都会执行相同的操作.它只影响检索找到的行的时间.

由于外部(TOASTed)数据也会被压缩,您的表不应超过1 GB(包括TOAST表),即使数据库中的光盘表示通常占用原始数据空间的2-3倍.这通常意味着,你没有吸尘,很多死元组会使你的桌子变得杂乱无章.

TOAST表的一个副作用是UPDATE可以更好地执行 INSERT/DELETE.因为:

在UPDATE操作期间,未更改字段的值通常保持原样; 因此,如果没有任何外部值发生更改,则具有外部值的行的更新不会产生任何TOAST成本.

不过,在你的情况下无所谓,因为你的计划是无论如何都要使大柱空.