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

时间:2011-11-20 01:35:46

标签: sql performance postgresql

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

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

2 个答案:

答案 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行的表(尽管它们是非常宽的行)。