PostgreSQL是否为只读事务运行一些性能优化

Vla*_*cea 15 database postgresql transactions readonly database-concurrency

根据参考文档,除了允许DEFERRABLE事务之外,READ ONLY事务标志是有用的吗?

SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY;
Run Code Online (Sandbox Code Playgroud)

除非事务也是SERIALIZABLE和READ ONLY,否则DEFERRABLE事务属性不起作用.当为事务选择所有这三个属性时,事务可能会在第一次获取其快照时阻塞,之后它可以在没有SERIALIZABLE事务的正常开销的情况下运行,并且没有任何可能导致序列化或被序列化取消的风险失败.此模式非常适合长时间运行的报告或备份.

数据库引擎是否为只读事务运行其他优化?

Vla*_*cea 8

总结Nick Barnes和Craig Ringer在评论中的评论:

  1. READ_ONLY标志不一定提供任何优化
  2. 设置READ_ONLY标志的主要好处是确保不会修改元组

  • 另外,postgres还有一个与只读事务的事务id相关的优化。Postgres 提供虚拟事务 ID,而不是普通事务 ID。它可以提高性能,因为将创建更少的事务 ID,从而加快冻结过程以避免回绕 (2认同)
  • @AlmasAbdrazak,是的,但是无论事务是否显式设置为只读,都会发生优化。碰巧未进行任何修改的事务也不会生成真实的事务 ID。https://www.postgresql.org/message-id/7011.1286918180@sss.pgh.pa.us (2认同)

小智 7

事实上,确实如此。让我在这里引用源代码注释:

/*
 * Check if we have just become "RO-safe". If we have, immediately release
 * all locks as they're not needed anymore. This also resets
 * MySerializableXact, so that subsequent calls to this function can exit
 * quickly.
 *
 * A transaction is flagged as RO_SAFE if all concurrent R/W transactions
 * commit without having conflicts out to an earlier snapshot, thus
 * ensuring that no conflicts are possible for this transaction.
 */
Run Code Online (Sandbox Code Playgroud)

  • 您提取的注释属于专门用于快照隔离的代码库的一部分。默认事务隔离级别是“READ COMMITTED”,它不会从这种优化中受益。 (3认同)