更新还是插入和删除?哪个更适合大文本列的存储/性能?
Posted
技术标签:
【中文标题】更新还是插入和删除?哪个更适合大文本列的存储/性能?【英文标题】:UPDATE or INSERT & DELETE? Which is better for storage / performance with large text columns? 【发布时间】:2011-11-20 01:35:46 【问题描述】:我有一个 Postgres DB 作为应用程序的一部分 当前的文本字段中填充了大约 300K 的文本。
表格中有大约 3 列可以常规填充 有了这么多信息。这导致表格结束 大约 100 行的演出。我想删除那些数据 列而不删除行中的其余信息。
UPDATE
将列设置为 ''
是否比 INSERT INTO SELECT
更好,我只选择我需要的列然后 DELETE
现有行?这是一个第 3 方应用程序,因此目前无法重写它们存储数据的方式。
【问题讨论】:
【参考方案1】:首先,对于 3 列约 300k 的文本,表格的大小不应超过 1 GB,只有 100 行。您是否启用了autovacuum
?或者您是否定期运行真空吸尘器?阅读vacuum in the manual。检查您的settings。
关于UPDATE
与INSERT
/ DELETE
的问题:由于PostgreSQL 的MVCC model 每个UPDATE
实际上是一个新的INSERT
。旧行将被保留并最终由 (auto
)vacuum
清除。 使用UPDATE
,更简单。恢复空间/性能的关键是吸尘。
但是,如果您必须处理所有或大多数行,并且能够以独占方式锁定表(或没有并发访问),则完全重写表会更快,方法是创建一个新表,或者像这样:
How to delete duplicate entries?还有相关的命令CLUSTER
。以完美的状态重写整个表和所有索引。击败VACUUM FULL
,因为它实际上也是REINDEX
。您可以尝试一次以查看没有死元组的表的实际大小。
关于性能:PostgreSQL 将大列的(压缩的)内容写入TOAST tables。所以标准查询执行相同,无论列的大小是 30k 还是 30MB。它只影响检索找到的行的时间。
由于离线 (TOASTed) 数据也会被压缩,因此您的表不应超过 1 GB(包括 TOAST 表),即使数据库中的磁盘表示通常占用 2-3 倍的空间原始数据。这通常意味着,您没有进行清理,并且很多死元组在您的表中乱七八糟。
TOAST 表的一个副作用是 UPDATE
的性能优于 INSERT
/ DELETE
because:
在 UPDATE 操作期间,未更改字段的值通常是 按原样保存;因此会导致更新具有线外值的行 如果没有任何外部值发生变化,则没有 TOAST 成本。
不过,在你的情况下应该没关系,因为你的计划是无论如何都要 NULL 大列。
【讨论】:
【参考方案2】:无论哪种方式都应该有效。 UPDATE 更简单,所以继续吧。
我能想到插入同一个/新表的唯一好处是减少了争用(因为您将写入一个新表,或者至少是一个单独的行)。但这对于只有 100 行的表可能没有实际意义(即使它们是非常宽的行)。
【讨论】:
以上是关于更新还是插入和删除?哪个更适合大文本列的存储/性能?的主要内容,如果未能解决你的问题,请参考以下文章