Slow PostgreSQL 9.3 query



大家好,

我有一个查询,看起来像:

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 and部分,那么所有的操作都在不到30ms的时间内执行,好得多。

在我的DDL我有一个索引定义为:

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

<标题> 我的数据empRec数据很少,只有110条记录。现在empRec中的所有值。selfManagerId = 1(所以现在不需要),当苹果加入应用程序时,情况会发生变化。

schedxemp用于多对多关系。

在这一点上,我真的想不出我能尝试什么来隔离/解决问题。

这个索引应该有帮助:

CREATE INDEX ON schedxemp (schedid, deactivatedts);

最新更新