Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database PostgreSQL是否对只读事务运行了一些性能优化_Database_Postgresql_Transactions_Readonly_Database Concurrency - Fatal编程技术网

Database PostgreSQL是否对只读事务运行了一些性能优化

Database PostgreSQL是否对只读事务运行了一些性能优化,database,postgresql,transactions,readonly,database-concurrency,Database,Postgresql,Transactions,Readonly,Database Concurrency,根据协议,只读事务标志除了允许可延迟事务之外是否有用 SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY; 除非 事务也是可序列化和只读的。当我们三个 如果为事务选择了这些属性,则事务可能 第一次获取其快照时阻止,之后才能运行 没有可序列化事务的正常开销,也没有 导致序列化或被序列化取消的任何风险 失败。此模式非常适合于长时间运行的报告或备份 数据库引擎是否为只读事务运行其他优化?总结Nick Barnes和Craig Ringer在问题注

根据协议,只读事务标志除了允许可延迟事务之外是否有用

SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY;
除非 事务也是可序列化和只读的。当我们三个 如果为事务选择了这些属性,则事务可能 第一次获取其快照时阻止,之后才能运行 没有可序列化事务的正常开销,也没有 导致序列化或被序列化取消的任何风险 失败。此模式非常适合于长时间运行的报告或备份


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

总结Nick Barnes和Craig Ringer在问题注释中的评论:

SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY;
  • 只读标志不一定提供任何优化
  • 设置只读标志的主要好处是确保不会修改元组

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

    /*
     * 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.
     */
    

    我的理解是,读写事务会带来一些开销,但在实际编写某些内容之前,不会产生这种开销。换句话说,就性能而言,
    只读
    事务应该与只包含读取的
    读写
    事务相同。这源于Postgres处理XID分配的方式(关于这方面的一些信息)。@NickBarnes也符合我的理解<代码>只读更安全。谢谢。因此,可延迟事务是唯一的实质性优化。@Vladmichalcea我想知道使用
    delerable
    可以提供什么实质性优化。文档中说“可延迟…在允许继续之前可能会延迟…一旦开始…它不会产生确保可序列化性所需的任何开销;因此序列化代码将没有理由强制它中止…使此选项适用于长时间运行的只读事务”。不被取消肯定有好处,但这种潜在的延迟权衡是否值得
    减少序列化开销
    ?对于短时间运行的查询不适用。对于使用JDBC的信息,postgres驱动程序就是这样做的:您提取的注释属于专用于快照隔离的代码库的一部分。默认事务隔离级别为
    READ COMMITTED
    ,这不会从该优化中受益。此外,postgres还有一个与只读事务的事务id相关的优化。Postgres提供虚拟事务id而不是普通事务id。它可以提高性能,因为创建的事务id会减少,从而加快冻结过程以避免wraparounds@AlmasAbdrazak,是的,但无论事务是否显式设置为只读,都会进行优化。碰巧没有进行任何修改的事务也不会生成真正的事务ID@我不知道,谢谢你的推荐