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

Ran*_*ger 4 postgresql database-performance wal

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

使用 WAL 会显着减少磁盘写入次数,因为只需将日志文件刷新到磁盘以确保提交事务,而不是事务更改的每个数据文件。

与简单地写入表/索引数据本身相比,连续写入 WAL 的性能如何?

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

Lau*_*lbe 5

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

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

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