更新还是插入和删除?哪个更适合大文本列的存储/性能?

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。

关于UPDATEINSERT / 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 行的表可能没有实际意义(即使它们是非常宽的行)。

【讨论】:

以上是关于更新还是插入和删除?哪个更适合大文本列的存储/性能?的主要内容,如果未能解决你的问题,请参考以下文章

哪个数据存储系统提供最佳更新/更新插入性能?

大数据性能调优之HBase的RowKey设计

定义具有更大长度的 VARCHAR2 列的影响

java和大数据哪个更有前途啊?零基础适合学哪个课程?

大数据在成本和性能方面适合频繁写入数据还是频繁读取数据?

哪个更适合tkinter网格,放置单个项目或循环遍历列表来放置它们?