PostgreSQL 查询在 LINUX 服务器上执行的时间太长
PostgreSQL query is taking too long to execute on LINUX server
我最近将 PostgreSQL 数据库部署到 Linux 服务器,其中一个存储过程需要大约 24 到 26 秒来获取结果。以前我将 PostgreSQL 数据库部署到 windows 服务器,而相同的存储过程只需要大约 1 到 1.5 秒。
在这两种情况下,我都使用具有相同数据量的相同数据库进行了测试。而且两台服务器都具有相同的配置,如 RAM、处理器等。
在 Linux 服务器 CPU 中执行我的存储过程时,使用率达到 100%。
Windows 的执行计划:
Linux 的执行计划:
如果您对此有任何解决方案,请告诉我。
罪魁祸首似乎在
billservice.posid = pos.posid
更具体地说,它在 pos table 上进行序列扫描。它应该进行索引扫描。
检查数据库中是否有这两个字段的索引。
也可能是因为 JIT 在 Linux 服务器而不是 windows 上发挥作用。检查 linux 服务器上的查询执行计划是否包含有关 JIT 的信息。
如果是,请检查 windows 版本中是否相同。如果不是,我怀疑是这种情况。
JIT 可能会增加更多开销,因此请尝试根据您的系统要求将 jit_above_cost、jit_inline_above_cost 等 jit 参数更改为适当的值,或者通过设置
完全禁用它们
jit=off
或
jit_above_cost = -1
我最近将 PostgreSQL 数据库部署到 Linux 服务器,其中一个存储过程需要大约 24 到 26 秒来获取结果。以前我将 PostgreSQL 数据库部署到 windows 服务器,而相同的存储过程只需要大约 1 到 1.5 秒。
在这两种情况下,我都使用具有相同数据量的相同数据库进行了测试。而且两台服务器都具有相同的配置,如 RAM、处理器等。
在 Linux 服务器 CPU 中执行我的存储过程时,使用率达到 100%。
Windows 的执行计划:
Linux 的执行计划:
如果您对此有任何解决方案,请告诉我。
罪魁祸首似乎在
billservice.posid = pos.posid
更具体地说,它在 pos table 上进行序列扫描。它应该进行索引扫描。
检查数据库中是否有这两个字段的索引。
也可能是因为 JIT 在 Linux 服务器而不是 windows 上发挥作用。检查 linux 服务器上的查询执行计划是否包含有关 JIT 的信息。 如果是,请检查 windows 版本中是否相同。如果不是,我怀疑是这种情况。
JIT 可能会增加更多开销,因此请尝试根据您的系统要求将 jit_above_cost、jit_inline_above_cost 等 jit 参数更改为适当的值,或者通过设置
完全禁用它们jit=off
或
jit_above_cost = -1