PostgreSQL从一个小表中选择一个经常更新的行

问题描述 投票:0回答:2

我正在使用PostgreSQL 9.6(Ubuntu 16.04),我有一个大约10k行的小表T,其中每行在高峰时间每分钟更新2次(类似于UPDATE T SET c1 = ?, c2 = ? WHERE id = ?)。此外,这是此表中唯一的更新操作,插入和删除通常根本不存在。

但是,我注意到在T中的SELECT查询有点慢,经过研究,我发现了"an update in PostgreSQL is actually a transaction of DELETE+INSERT (due MVCC)"。此外,我发现了类似的问题,如this onethis one,但关于UPDATE查询。

我的问题是:连续频繁更新是否会减慢选择查询的速度?如果是这样,处理它的正确方法是什么?

postgresql postgresql-performance vacuum autovacuum
2个回答
0
投票

是的,正如你所说,频繁的更新/删除可能是查询速度慢的原因。因为,任何已删除的行(实际上是DELETE或从UPDATE删除)只是标记为删除并实际停留在数据页中,直到它用于另一个插入。要避免这种情况,您应该在桌面上运行适当的维护例程,如VACUUM。另一个简单的解决方案是,

create table similar_table;

insert into similar_table;

select * from original_table;

drop original_table;

alter table rename similar_table original_table;

这可以用于小表而不是使用VACUUM。

您还应该查看查询计划。糟糕的查询也会使选择变慢。


0
投票

如果删除或更新了行,则自动真空过程会自动清除旧版本,并重新使用该空间。如果您只更新非索引列,则“删除/插入”部分实际上根本不会发生(称为“HOT-Heap Only Tuples”更新)。

使用较小的fillfactor创建表以在数据库块上留出空间以存储“新”行(您可能想要尝试60%或70%的内容)可能是个好主意。

“频繁”更新通常只是一个问题,如果它们如此频繁以至于自动真空无法跟上,或者如果您有这么多并发和开放的事务,那么自动真空无法释放任何空间。通常,通过使自动真空更具侵略性可以减轻这种情况。

无论如何,通过索引列执行单行查找的查询不太可能受到频繁更新的影响。如果你看到减速,那么你可能想要定期reindex表。

© www.soinside.com 2019 - 2024. All rights reserved.