我有一种情况,每行有一个 Web 会话,但该会话将对该行中的 hstore 字段生成数十个更新,一次一个 k/v。最后,我会有一个完整的结构。每个会话的密钥将或多或少相同,但会随着时间的推移而演变。这些值将是混合的,有些值在每个会话中都是唯一的(例如电子邮件),有些值有很多重复(例如男性/女性)。
我假设锁争用只会出现在行级别,这很好。我还应该注意哪些问题?我对 hstore 的经验为零,所以我真的想确保我了解我的目的。任何反馈表示赞赏。
我有一种情况,每行有一个 Web 会话,但该会话将对该行中的 hstore 字段生成数十个更新,一次一个 k/v。最后,我会有一个完整的结构。每个会话的密钥将或多或少相同,但会随着时间的推移而演变。这些值将是混合的,有些值在每个会话中都是唯一的(例如电子邮件),有些值有很多重复(例如男性/女性)。
我假设锁争用只会出现在行级别,这很好。我还应该注意哪些问题?我对 hstore 的经验为零,所以我真的想确保我了解我的目的。任何反馈表示赞赏。
由于MVCC 机制,如果有很多 UPDATE,无论多么小,每一个更新都会导致整行被重写为新版本。
然后,当确定没有事务可能需要它时,autovacuum 会在某个时候拾取该行的旧版本,并且它的空间将被标记为可重用。
新旧行的磁盘空间不断周转会导致碎片化,尤其是在行很大的情况下。
此外,整个操作集都记录到WAL 文件中(除非表未记录)。
由于这些原因,大列的高频更新是 postgres 的最坏情况。
因此,如果该会话数据一开始并不真正需要持久存储,那么像 Redis 这样的混合磁盘内存专用键/存储引擎可能会表现得更好。
否则,另一个问题:缓存表的填充因子是什么?有关于如何减轻困难的良好信息和建议。