【问题标题】:PostgreSQL query is taking too long to execute on LINUX serverPostgreSQL 查询在 LINUX 服务器上执行的时间太长
【发布时间】:2020-01-28 11:48:04
【问题描述】:

我最近将 PostgreSQL 数据库部署到 Linux 服务器,其中一个存储过程需要大约 24 到 26 秒才能获取结果。以前我将 PostgreSQL 数据库部署到 windows 服务器,相同的存储过程只需要大约 1 到 1.5 秒。

在这两种情况下,我都使用具有相同数据量的相同数据库进行了测试。并且两台服务器都具有相同的配置,例如 RAM、处理器等。

在 Linux 服务器中执行我的存储过程时,CPU 使用率达到 100%。

Windows 执行计划:

Linux 执行计划:

如果您对此有任何解决方案,请告诉我。

【问题讨论】:

  • 请添加 1) 过程/查询,2) 示例数据,3) 表/索引结构和 4) explain analyze
  • 你能显示存储过程吗?它可能有多种不同的原因为什么它这么慢,但如果你从表中选择,我会首先检查索引......
  • 这是不可读的。请转EXPLAIN (ANALYZE, BUFFERS) SELECT ... 并将输出(格式化)复制并粘贴到问题中。
  • 是的,成本配置相同,我没有对两台服务器进行任何更改。

标签: linux postgresql .net-core postgresql-12


【解决方案1】:

这也可能是因为 JIT 在 Linux 服务器而不是 Windows 中发挥作用。检查 linux 服务器上的查询执行计划是否包含有关 JIT 的信息。 如果是,请检查在 windows 版本中是否相同。如果不是,我怀疑是这样的。

JIT 可能会增加更多开销,因此请尝试根据您的系统要求将 jit_above_cost、jit_inline_above_cost 等 jit 参数更改为适当的值,或通过设置完全禁用这些参数

jit=off

jit_above_cost = -1

【讨论】:

    【解决方案2】:

    罪魁祸首似乎在

    billservice.posid = pos.posid
    

    更具体地说,它对 pos 表进行序列扫描。它应该进行索引扫描。

    检查数据库中这两个文件是否有索引。

    【讨论】:

    • 是的,两个表都有索引,
    • 尝试重新索引 pos 表并重试。
    • 我想知道为什么Linux服务器会出现缓慢,因为它在Windows服务器上运行良好。
    • 因为我从执行计划中可以看到,它在 pos 表上进行顺序扫描而不是索引扫描。
    • 重建所有索引后没有任何改善
    猜你喜欢
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多