缓慢的 PostgreSQL 9.3 查询
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 和 部分,那么一切都在不到 30 毫秒内执行,好多了。
在我的 DDL 中,我确实有一个索引定义为:
CREATE INDEX emprec_sm_enum_ndx ON employeekeeper.emprec
USING btree (selfmanagerid, employeenumber);
我的数据
empRec数据很少,110条记录。
现在 empRec.selfManagerId 中的所有值 = 1(所以现在不需要),随着 pple 加入应用程序,事情会发生变化。
schedxemp 用于多对多关系。它拥有少于 25K 条记录。
在这一点上,我真的想不出我可以尝试什么来解决isolate/solve这个问题。
这个索引应该有帮助:
CREATE INDEX ON schedxemp (schedid, deactivatedts);
大家好,
我的查询如下所示:
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 条记录。
在这一点上,我真的想不出我可以尝试什么来解决isolate/solve这个问题。
这个索引应该有帮助:
CREATE INDEX ON schedxemp (schedid, deactivatedts);