在 Postgres 中禁用 MVCC
Disabling MVCC in Postgres
我有数十年的 MSSQL 经验,但 none Postgres 及其 MVCC 并发控制风格。
在 MSSQL 中,如果我有一个非常大的只读数据集,我会将数据库设置为只读(为了安全)并使用事务隔离级别 read uncommitted,这应该避免锁争用,这无论如何都不需要数据集。
在 Postgres 中,有一些等效的东西吗?某种将数据库设置为只读并确保 PG 完全安全的方法,不使用 MVCC,只读取而不制作行副本?因为看起来 MVCC 有一些相当大的开销,对于非常大的被动数据集的多个读取器来说,这似乎可能很昂贵。
编辑:评论说我误解了只有在写入时才进行复制,而不是我假设的读取。
不,没有办法,也没有理由。
自 PostgreSQL 以来,写入者永远不会阻止读取者,反之亦然,正是因为您要禁用它的 MVCC 实现。所以不需要读取未提交数据的令人讨厌的拐杖。
"MVCC" 代表“多版本并发控制”。同一 table 行的多个版本仅由写入 activity 生成(主要是 UPDATE
)。
如果您的数据库是只读 - 强制或自愿,对于这个问题的目的都是一样的 - 那么一行永远不能有多个版本。这个问题没有实际意义。
我有数十年的 MSSQL 经验,但 none Postgres 及其 MVCC 并发控制风格。
在 MSSQL 中,如果我有一个非常大的只读数据集,我会将数据库设置为只读(为了安全)并使用事务隔离级别 read uncommitted,这应该避免锁争用,这无论如何都不需要数据集。
在 Postgres 中,有一些等效的东西吗?某种将数据库设置为只读并确保 PG 完全安全的方法,不使用 MVCC,只读取而不制作行副本?因为看起来 MVCC 有一些相当大的开销,对于非常大的被动数据集的多个读取器来说,这似乎可能很昂贵。
编辑:评论说我误解了只有在写入时才进行复制,而不是我假设的读取。
不,没有办法,也没有理由。
自 PostgreSQL 以来,写入者永远不会阻止读取者,反之亦然,正是因为您要禁用它的 MVCC 实现。所以不需要读取未提交数据的令人讨厌的拐杖。
"MVCC" 代表“多版本并发控制”。同一 table 行的多个版本仅由写入 activity 生成(主要是 UPDATE
)。
如果您的数据库是只读 - 强制或自愿,对于这个问题的目的都是一样的 - 那么一行永远不能有多个版本。这个问题没有实际意义。