在对我们的 PostgreSQL 数据库(Ubuntu Focal,PostgreSQL 13.3)进行性能改进时,我在一个快速的本地 NVME 驱动器上创建了一个“临时”表空间。这很好用,由大型查询创建的临时表和 temp_files 最终都在那里,从而减轻了主数据驱动器的大量负载。
但是,我们经常使用服务器端CURSORS
,并且似乎temp_files
由那些创建的总是最终在主数据卷上,从而导致比我们真正想要的更多的 I/O。
2022-03-13 00:59:51.692 UTC 1350170 xx@xx 日志:临时文件:路径“base/pgsql_tmp/pgsql_tmp1350170.54”,大小 564228392
2022-03-13 00:59:51.692 UTC 1350170 xx@xx 声明:从“xx”获取转发 5569
我已经做了尽可能多的work_mem
调整,但是我们的许多查询都很大(temp_files 通常超过 1GB)。我们最大的瓶颈是数据驱动器上的 I/O。因此,如果我可以将这些 temp_files 放到单独的本地 NVME 驱动器上,那就太棒了。
我见过一些地方建议用符号链接替换pgsql_tmp
dir from~/main/base/pgsql_tmp
到另一个驱动器,但也警告说这不一定安全。
这是一种安全的方法吗,还是有另一种更好的方法?有没有办法告诉PostgreSQL把temp_files
生成的CURSORS
放到临时驱动器上?
谢谢,
如果这些游标被声明为 WITH HOLD,那么我认为您正在从 src/backend/storage/file/fd.c 遇到这个位:
也许这应该记录在用户空间中,而不仅仅是源代码注释。
除了删除 !interXact 测试并编译您自己的二进制文件之外,我没有看到您可以做任何事情。
我可能会发现符号链接 ~/main/base/pgsql_tmp 更可取。反对它的人有没有说为什么?