将 PostgreSQL WAL 的使用分配给数据库/表/查询

hma*_*ett 3 postgresql postgresql-performance

我有一个 PostgreSQL 11 数据库,其中包含多个数据库,其中一些包含经常插入和更新的表。最近写入 WAL 文件的数据量大幅增加(约 400%),尽管我相信插入数据库的数量仅增加了约 20%。

因此,我们不仅使用了更多的磁盘,而且我们的数据库性能现在似乎受到 WAL 所在磁盘的写入器性能的限制。

应用程序更新非常频繁,可能是应用程序中的某些内容(我们控制并能够更改)发生了变化,这导致插入/更新的效率降低,但我不知道我们如何会识别。自从这种行为改变开始以来,可能已经发生了很多变化,自从它第一次被注意到以来,可能已经发生了很多变化。

有没有办法确定哪些数据库/表/查询正在写入 WAL,以及(大约)数量?

Lau*_*lbe 5

如果您使用的是 PostgreSQL v13,则可以安装pg_stat_statements,它会记录wal_bytes列中每个语句的 WAL 数量。所以你可以跑

CREATE EXTENSION IF NOT EXISTS pg_stat_statements;

SELECT wal_bytes, calls, query
FROM pg_stat_statements
ORDER BY wal_bytes DESC
LIMIT 10;
Run Code Online (Sandbox Code Playgroud)

WAL 本身与某个 SQL 语句没有联系,但是如果您检查带有 的条目pg_waldump,您可以将它们连接到与数据库对象相对应的某些文件。那条路很麻烦。

升级到 v13。