Postgres select 查询在使用 JDBC 时运行缓慢,但在来自同一服务器的 PSQL 中使用 运行 时运行速度很快
Postgres select query runs slow when using JDBC but quick when running it in PSQL from the same server
我有以下非常简单的查询,我正在 运行 宁使用 JDBC 花费过多的时间到 运行。数据库是 AWS RDS 服务器。 rt2 table 有大约 600K 条目,CM2 table 大约有 300K。查询 returns 11230 行。
SELECT cm2.target
from sysmgmt.sys_root rt2
join cmgmt.member cm2 on cm2.cmid = rt2.cmid and cm2.version=rt2.work_version_id
where rt2.tid=1001
and rt2.proj='d791194b-f2b7-42a7-aba7-f879e052e59d'::uuid
and rt2.deleted = false
and cm2.tid=1001 and cm2.proj = 'd791194b-f2b7-42a7-aba7-f879e052e59d'::uuid;
当我 运行 使用 JDBC 调用此查询时需要 40 秒!但是,如果我 运行 在同一台机器上的 PSQL 命令行中执行完全相同的查询,它几乎是瞬时的。
运行 EXPLAIN ANALYZE 显示以下计划。
Nested Loop (cost=0.85..7.77 rows=1 width=176) (actual time=0.030..36.067 rows=11230 loops=1)
-> Index Scan using m_cell_tid_proj_version_idx on member cm2 (cost=0.42..3.32 rows=1 width=197) (actual time=0.020..2.988 rows=11230 loops=1)
Index Cond: ((tid = '1001'::numeric) AND (proj = 'ed1a7c79-a3a1-4d8e-815b-0fbbcbd7bf4b'::uuid))
-> Index Scan using sys_root_cmid_workversion_idx on sys_root rt2 (cost=0.42..4.45 rows=1 width=21) (actual time=0.002..0.002 rows=1 loops=11230)
Index Cond: ((cmid = cm2.cmid) AND (work_version_id = cm2.version))
Filter: ((NOT deleted) AND (tid = '1001'::numeric) AND (proj = 'ed1a7c79-a3a1-4d8e-815b-0fbbcbd7bf4b'::uuid))
Planning Time: 0.374 ms
Execution Time: 36.499 ms
有些事情我已经尝试加快速度。
- 重新排列查询
- 添加匹配更好的索引
- 更改填充因子(似乎没有任何效果)
- 真空
None这些好像没什么效果。 java 代码非常简单,运行 查询然后遍历结果。时间是在 executeQuery 之前和之后。
Took :[40644.067138] Comment:found 11230 SQL Query:[SELECT cm2.target from sysmgmt.sys_root rt2 join mgmt.member cm2 on cm2.cmid = rt2.cmid and cm2.version=rt2.work_version_id where rt2.tid=1001 and rt2.proj='ed1a7c79-a3a1-4d8e-815b-0fbbcbd7bf4b'::uuid and cm2.tid=1001 and cm2.proj = 'ed1a7c79-a3a1-4d8e-815b-0fbbcbd7bf4b'::uuid and rt2.deleted = false]
大约有 5 到 10 个其他查询 运行 在同一个事务中,其他查询是否可能在到达此查询时导致下游问题?
如果有人对可能出现的问题有任何想法,我将不胜感激。
事实证明,解释分析计划在 运行 处于 activity 的上下文中时是不同的。打开 auto_explain 参数并将其记录到 postgres 日志文件表明该计划与我 运行 将其作为独立请求时的计划不同。然后问题变成了“如何让它做正确的事情?”。答案是在数据库上将 default_statistics_target 从 100 和 运行 ANALYZE 调高到 200。我还支持 运行 加入 table 命令。在执行这两项操作时,问题就消失了(希望永远好)。这个 wiki https://wiki.postgresql.org/wiki/Performance_Optimization 也被证明是一个很好的资源。
我有以下非常简单的查询,我正在 运行 宁使用 JDBC 花费过多的时间到 运行。数据库是 AWS RDS 服务器。 rt2 table 有大约 600K 条目,CM2 table 大约有 300K。查询 returns 11230 行。
SELECT cm2.target
from sysmgmt.sys_root rt2
join cmgmt.member cm2 on cm2.cmid = rt2.cmid and cm2.version=rt2.work_version_id
where rt2.tid=1001
and rt2.proj='d791194b-f2b7-42a7-aba7-f879e052e59d'::uuid
and rt2.deleted = false
and cm2.tid=1001 and cm2.proj = 'd791194b-f2b7-42a7-aba7-f879e052e59d'::uuid;
当我 运行 使用 JDBC 调用此查询时需要 40 秒!但是,如果我 运行 在同一台机器上的 PSQL 命令行中执行完全相同的查询,它几乎是瞬时的。
运行 EXPLAIN ANALYZE 显示以下计划。
Nested Loop (cost=0.85..7.77 rows=1 width=176) (actual time=0.030..36.067 rows=11230 loops=1)
-> Index Scan using m_cell_tid_proj_version_idx on member cm2 (cost=0.42..3.32 rows=1 width=197) (actual time=0.020..2.988 rows=11230 loops=1)
Index Cond: ((tid = '1001'::numeric) AND (proj = 'ed1a7c79-a3a1-4d8e-815b-0fbbcbd7bf4b'::uuid))
-> Index Scan using sys_root_cmid_workversion_idx on sys_root rt2 (cost=0.42..4.45 rows=1 width=21) (actual time=0.002..0.002 rows=1 loops=11230)
Index Cond: ((cmid = cm2.cmid) AND (work_version_id = cm2.version))
Filter: ((NOT deleted) AND (tid = '1001'::numeric) AND (proj = 'ed1a7c79-a3a1-4d8e-815b-0fbbcbd7bf4b'::uuid))
Planning Time: 0.374 ms
Execution Time: 36.499 ms
有些事情我已经尝试加快速度。
- 重新排列查询
- 添加匹配更好的索引
- 更改填充因子(似乎没有任何效果)
- 真空
None这些好像没什么效果。 java 代码非常简单,运行 查询然后遍历结果。时间是在 executeQuery 之前和之后。
Took :[40644.067138] Comment:found 11230 SQL Query:[SELECT cm2.target from sysmgmt.sys_root rt2 join mgmt.member cm2 on cm2.cmid = rt2.cmid and cm2.version=rt2.work_version_id where rt2.tid=1001 and rt2.proj='ed1a7c79-a3a1-4d8e-815b-0fbbcbd7bf4b'::uuid and cm2.tid=1001 and cm2.proj = 'ed1a7c79-a3a1-4d8e-815b-0fbbcbd7bf4b'::uuid and rt2.deleted = false]
大约有 5 到 10 个其他查询 运行 在同一个事务中,其他查询是否可能在到达此查询时导致下游问题?
如果有人对可能出现的问题有任何想法,我将不胜感激。
事实证明,解释分析计划在 运行 处于 activity 的上下文中时是不同的。打开 auto_explain 参数并将其记录到 postgres 日志文件表明该计划与我 运行 将其作为独立请求时的计划不同。然后问题变成了“如何让它做正确的事情?”。答案是在数据库上将 default_statistics_target 从 100 和 运行 ANALYZE 调高到 200。我还支持 运行 加入 table 命令。在执行这两项操作时,问题就消失了(希望永远好)。这个 wiki https://wiki.postgresql.org/wiki/Performance_Optimization 也被证明是一个很好的资源。