安东尼·索托隆戈·莱昂:TOAST及其对PostgreSQL并行性的影响

安东尼·索托隆戈·莱昂:TOAST及其对PostgreSQL并行性的影响

💡 原文英文,约1400词,阅读约需5分钟。
📝

内容提要

自从PostgreSQL 9.6版本发布以来,查询并行性的功能已经出现并成为提高查询性能的好选择。可以通过调整一些参数来管理并行性的行为。表的大小会影响并行工作者的数量。TOAST表的大小似乎不会被考虑在内。可以通过修改参数来改善性能。在特定环境中进行测试是推荐的。

🔎

延伸解读

TOAST表大小为何被忽略?

文章通过实验发现,当表包含TOAST数据时,规划器仅根据主表大小(45MB)计算并行工作者数量,而忽略了TOAST表的大小(5GB)。这意味着即使TOAST数据量很大,默认参数下可能只使用少量并行工作者,无法充分利用并行查询的优势。因此,对于TOAST数据占比较高的表,需要特别关注并行度的配置。

调整参数以提升并行度

文章演示了通过修改min_parallel_table_scan_size参数(如从8MB降至4MB)可以强制规划器使用更多并行工作者(从2个增加到3个),从而降低查询执行时间约25%。此外,还可以使用表级存储参数parallel_workers直接指定并行工作者数量(如设置为4),进一步优化性能。这些调整需要根据实际硬件环境进行测试。

硬件环境差异与测试建议

文章强调,并行查询的性能提升效果取决于CPU和磁盘等硬件配置,不同环境下可能差异显著。因此,在生产环境中应用参数调整前,建议在相似环境中进行基准测试,以验证实际收益。盲目调整参数可能导致资源竞争或性能下降。

❓

Q&A

PostgreSQL 从哪个版本开始支持查询并行性?

PostgreSQL 9.6 版本开始引入查询并行性功能。

如何控制 PostgreSQL 中并行工作者的数量?

可以通过调整参数 max_parallel_workers_per_gather 来控制并行工作者的数量,默认值为 2。此外,还可以使用存储参数 parallel_workers 针对特定表设置并行工作者数量。

TOAST 表的大小会影响 PostgreSQL 并行工作者的数量估算吗?

不会。TOAST 表的大小似乎不会被考虑在并行工作者数量的估算中。例如,一个表的主表大小为 45MB,TOAST 表为 5GB,但规划器仍然只使用 2 个并行工作者(基于主表大小)。

min_parallel_table_scan_size 参数如何影响并行工作者的数量?

min_parallel_table_scan_size 参数决定了表扫描使用并行工作者的最小表大小。工作者的数量根据表大小以 3 为公比的几何级数计算。例如,默认值 8MB 时,表大小小于 8MB 使用 0 个工作者,小于 24MB 使用 1 个,小于 72MB 使用 2 个,以此类推。

如何强制 PostgreSQL 使用更多的并行工作者?

可以通过修改 min_parallel_table_scan_size 参数来强制使用更多的并行工作者。例如,将其设置为 '4MB' 可以强制使用 3 个工作者。此外,也可以使用 ALTER TABLE 设置表的 parallel_workers 存储参数,例如设置为 4 来使用 4 个工作者。

在 PostgreSQL 中调整并行参数一定能提升性能吗?

不一定。性能提升取决于硬件环境(如 CPU 和磁盘类型),不同环境下的表现可能不同。因此,建议在实际环境中进行测试以确定最佳参数配置。

🏷️

标签

➡️

继续阅读