预写日志记录如何提高 Postgres 中的 IO 性能?

How does write ahead logging improve IO performance in Postgres?

我一直在阅读 Postgres 手册的 WAL chapter,但对章节的一部分感到困惑:

Using WAL results in a significantly reduced number of disk writes, because only the log file needs to be flushed to disk to guarantee that a transaction is committed, rather than every data file changed by the transaction.

为什么连续写入 WAL 比简单地写入 table/index 数据本身更高效?

正如我所见(暂时忘记 WAL 的弹性优势)postgres 需要完成两个磁盘操作;首先 pg 需要提交到磁盘上的 WAL,然后您仍然需要更改 table 数据以与 WAL 一致。我确信我误解了这一点的一个基本方面,但似乎在客户端事务和 table 数据的最终状态之间添加一个额外的步骤实际上并不能提高整体性能。提前致谢!

你基本上是对的:对事务日志的额外写入本身不会减少 I/O 负载。

但是一个事务通常会涉及多个文件(表、索引等)。如果您将所有这些文件强制存储(“同步”),与仅同步单个文件相比,您将承担更多 I/O 负载。

当然,所有这些文件最终都必须写入和同步(在检查点期间),但通常相同的数据在两个检查点之间被修改多次,并且那么相应的文件只需同步一次。