PostgreSQL 9.3 慢查询

Posted

技术标签:

【中文标题】PostgreSQL 9.3 慢查询【英文标题】:Slow PostgreSQL 9.3 query 【发布时间】:2021-01-14 17:50:27 【问题描述】:

大家好,

我的查询看起来像:

EXPLAIN ANALYZE
SELECT empRec.lastName, empRec.FirstName 
FROM schedXEmp 
INNER JOIN empRec ON 
    empRec.selfManagerId = 1 and empRec.employeeNumber = schedXEmp.employeeNumber 
WHERE schedXEmp.schedId = 22480 AND deactivatedTS > NOW () 
ORDER BY empRec.lastName, empRec.FirstName;

我得到:

Sort  (cost=633.26..633.27 rows=1 width=136) (actual time=570.691..570.692 rows=1 loops=1)"
Sort Key: emprec.lastname, emprec.firstname"
Sort Method: quicksort  Memory: 25kB"
->  Nested Loop  (cost=0.00..633.25 rows=1 width=136) (actual time=532.276..570.664 rows=1 loops=1)"
    Join Filter: (schedxemp.employeenumber = emprec.employeenumber)"
      Rows Removed by Join Filter: 106"
      ->  Seq Scan on emprec  (cost=0.00..4.34 rows=1 width=144) (actual time=0.012..0.207 rows=107 loops=1)"
            Filter: (selfmanagerid = 1)"
      ->  Seq Scan on schedxemp  (cost=0.00..628.43 rows=39 width=8) (actual time=5.124..5.323 rows=1 loops=107)"
            Filter: ((schedid = 22480) AND (deactivatedts > now()))"
            Rows Removed by Filter: 23405"
Total runtime: 570.753 ms"

虽然这个延迟可能看起来并不重要,但它确实会导致一个问题,因为查询在单个页面中调用了大约 250 个,从而导致超时。

在连接中,如果我删除 empRec.selfManagerId = 1 和 部分,那么一切都在不到 30 毫秒的时间内执行,更好。

在我的 DDL 中,我确实有一个索引定义为:

CREATE INDEX emprec_sm_enum_ndx ON employeekeeper.emprec
  USING btree (selfmanagerid, employeenumber);

我的数据

empRec 的数据很少,只有 110 条记录。 目前 empRec.selfManagerId = 1 中的所有值(因此暂时不需要),随着 pple 加入应用程序,情况会发生变化。

schedxemp 用于多对多关系。它保存的记录略少于 25K。

在这一点上,我真的想不出我可以尝试隔离/解决问题。

【问题讨论】:

"查询在单个页面中调用了大约 250 个" - 这听起来像是一个糟糕的设计。为什么不使用所有参数运行一次,以便返回 250 行? 同意,相当大的重构。正在计划中以备不时之需。现在这里是-10c。看不到雨。 :) 【参考方案1】:

这个索引应该有帮助:

CREATE INDEX ON schedxemp (schedid, deactivatedts);

【讨论】:

嗯,做到了。我确信瓶子 nexk 在 empRec 中。非常感谢。

以上是关于PostgreSQL 9.3 慢查询的主要内容,如果未能解决你的问题,请参考以下文章

特定 PostgreSQL 客户端/版本中的慢查询

使用 current_date::date 而不是硬编码日期的 Postgres 查询非常慢

PostgreSQL 9.3 触发函数以参数化名称插入表

window下安装好postgreSQL 9.3用cmd命令进入数据库(搞的我这个菜鸟只剩半条命)

如何在windows下手动初始化PostgreSQL数据库

postgres 从 9.5 升级到 11 将连接更改为嵌套循环,使其非常慢