我正在使用PostgreSQL 9.6(Ubuntu 16.04),我有一个大约10k行的小表T,其中每行在高峰时间每分钟更新2次(类似UPDATE T SET c1 = ?, c2 = ? WHERE id = ?
)。此外,这是此表中唯一的更新操作,并且根本不会插入和删除。
但是,我注意到T中的 SELECT
查询有点慢,经过研究后,我发现 { {3}} 的。此外,我还发现了"an update in PostgreSQL is actually a transaction of DELETE+INSERT (due MVCC)"和this one等类似问题,但与 UPDATE
查询有关。
我的问题是:连续频繁更新是否会减慢选择查询的速度?如果是这样,处理它的正确方法是什么?
答案 0 :(得分: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。
您还应该查看查询计划。糟糕的查询也会使选择变慢。
答案 1 :(得分:0)
如果删除或更新了一行,则自动真空过程会自动清除旧版本,并重新使用该空间。如果您只更新非索引列,则删除/插入"部分实际上并没有发生(称为" HOT - Heap Only Tuples"更新)。
创建具有较小fillfactor的表可能是个好主意,以便在数据库块上留出空间来存储" new"行(你可能想尝试60%或70%)
"频繁"更新通常只是一个问题,如果它们如此频繁,以至于自动真空无法跟上,或者如果你有这么多并发和开放的交易,那么自动真空无法释放任何空间。通常,通过使自动真空更具侵略性可以减轻这种情况。
通过索引列执行单行查询的查询不太可能受到频繁更新的影响。 如果你确实看到减速,那么你可能希望定期reindex
该表。