迈克尔·班克:快速基准测试:ANALYZE 与 maintenance_io_concurrency

迈克尔·班克:快速基准测试:ANALYZE 与 maintenance_io_concurrency

💡 原文英文,约700词,阅读约需3分钟。
📝

内容提要

PostgreSQL 14 引入了 ANALYZE 命令的预取功能,使统计采样速度提高了 6-7 倍。对于高性能的本地 NVME 存储,建议将 maintenance_io_concurrency 增加到 20-50 或更高。

🔎

延伸解读

ANALYZE 的 I/O 模式与预取机制

ANALYZE 仅采样表中的部分数据块,其 I/O 模式更接近随机访问而非顺序读取。PostgreSQL 14 引入预取功能,通过 maintenance_io_concurrency 参数控制,可提前告知操作系统内核接下来要读取的块,从而提升采样效率。该参数默认值为 10,不同于 effective_io_concurrency 的默认值 1。

基准测试结果解读

在 Debian 12 上使用 PostgreSQL 13.16 和 14.13 进行测试,硬件为 Intel i7-1280P 和 NVMe 存储。结果显示,版本 13 的 ANALYZE 耗时不受 maintenance_io_concurrency 影响;版本 14 在参数设为 5 或更高时,ANALYZE 速度显著提升,最高可达 6-7 倍。默认值 10 已比版本 13 快 3-4 倍,而超过 50 后提升幅度减小。

配置建议与注意事项

对于高性能本地 NVMe 存储,建议将 maintenance_io_concurrency 增加到 20-50 或更高,以充分利用预取优势。但需注意,若关闭预取(设为 0)或设为 1,版本 14 的 ANALYZE 性能反而比版本 13 更差。由于默认值为 10,实际使用中通常不会遇到此问题。

Q&A

PostgreSQL 14 中 ANALYZE 命令的预取功能有什么优势?

ANALYZE 命令的预取功能使统计采样速度提高了 6-7 倍,显著提升了性能。

如何优化 PostgreSQL 的 maintenance_io_concurrency 参数?

建议在高性能本地 NVME 存储上将 maintenance_io_concurrency 增加到 20-50 或更高,以提高性能。

PostgreSQL 14 的默认 maintenance_io_concurrency 值是多少?

PostgreSQL 14 的默认 maintenance_io_concurrency 值为 10。

ANALYZE 在 PostgreSQL 中的作用是什么?

ANALYZE 用于更新 Postgres 查询规划器的数据统计,确保查询优化的准确性。

关闭预取功能对 PostgreSQL 14 的性能影响如何?

关闭预取功能或将 maintenance_io_concurrency 设置为 1 时,性能比版本 13 更差,但默认值为 10 不会影响实际使用。

PostgreSQL 14 在 maintenance_io_concurrency 设置为 5 时的性能表现如何?

在 maintenance_io_concurrency 设置为 5 或更高时,ANALYZE 的速度显著提升,达到几倍的加速效果。

🏷️

标签

➡️

继续阅读