我有一个postgres数据库作为应用程序的一部分 目前,文本字段中填充了大约300K的文本。
表中大约有3列可以常规填充 有这么多信息。这导致表格结束 大约100行的演出。我想删除那些数据 列没有删除行中的其他信息 - 我的 问题是,如果我做更新设置columns =''比那更好 插入选择我只需要选择我需要的行然后 删除现有行。它是第三方应用程序,因此此时无法重写它们存储数据的方式。
答案 0 :(得分:5)
首先,对于3列~300k文本,表格的大小不应超过1 GB,只有100行。你有autovacuum吗?或者你经常吸尘吗?阅读vacuum in the manual。检查您的settings。
关于UPDATE与INSERT / DELETE的问题:由于PostgreSQL的MVCC model,每个UPDATE实际上都是一个新的INSERT。旧排将被保留并最终通过真空清除。 使用UPDATE ,它更简单。恢复空间/性能的关键是吸尘。
还有相关命令CLUSTER。重写整个表和所有索引的完美状态。节拍VACUUM FULL
,因为它实际上也是REINDEX
。您可以尝试一次以查看没有死元组的表的实际大小。
关于性能:PostgreSQL将大列的(压缩)内容写入TOAST tables。因此,无论列的大小是30k还是30MB,标准查询都会执行相同的操作。它只影响检索找到的行的时间。
由于外联(TOASTed)数据也会被压缩,您的表不应超过1 GB(包括TOAST表),即使数据库中的光盘表示通常占用的空间的2-3倍原始数据。这通常意味着,你没有吸尘,很多死元组会使你的桌子变得杂乱无章。
TOAST表的一个副作用是 UPDATE可以执行更好的 INSERT / DELETE。这是因为:
在UPDATE操作期间,未更改字段的值通常是 保持原样;所以带有行外值的行的UPDATE会产生 如果没有任何外线值发生变化,则无TOAST成本。
在你的情况下,无论如何,因为你的计划是无论如何都要将大柱空为止。
答案 1 :(得分:0)
无论哪种方式都应该有效。 UPDATE更简单,所以请继续使用。
我能想到的唯一好处就是插入到同一个/新表中减少了争用(因为你将写入一个新表,或者至少是一个单独的行)。但这可能没有一个只有100行的表(尽管它们是非常宽的行)。