慢速运行Postgres查询

问题描述 投票:1回答:1

我有这个查询,我的数据库需要很长时间。此SQL是从应用程序内部的ORM(Hibernate)生成的。我无权访问源代码。

我想知道是否有人可以看看下面的ANALYZE EXPLAIN输出,并建议我可以做任何Postgres调整。

我不知道从哪里开始或如何调整我的数据库来为此查询提供服务。

查询看起来像这样

select 
    resourceta0_.RES_ID as col_0_0_ 
from
    HFJ_RESOURCE resourceta0_ 
    left outer join HFJ_RES_LINK myresource1_ on resourceta0_.RES_ID = myresource1_.TARGET_RESOURCE_ID 
    left outer join HFJ_SPIDX_DATE myparamsda2_ on resourceta0_.RES_ID = myparamsda2_.RES_ID 
    left outer join HFJ_SPIDX_TOKEN myparamsto3_ on resourceta0_.RES_ID = myparamsto3_.RES_ID 
where 
    (myresource1_.SRC_RESOURCE_ID in ('4954427' ... many more))
    and myparamsda2_.HASH_IDENTITY=`5247847184787287691` and 
(myparamsda2_.SP_VALUE_LOW>='1950-07-01 11:30:00' or myparamsda2_.SP_VALUE_HIGH>='1950-07-01 11:30:00') 
    and myparamsda2_.HASH_IDENTITY='5247847184787287691' 
    and (myparamsda2_.SP_VALUE_LOW<='1960-06-30 12:29:59.999' or myparamsda2_.SP_VALUE_HIGH<='1960-06-30 12:29:59.999') 
    and (myparamsto3_.HASH_VALUE in ('-5305902187566578701')) 
limit '500'

执行计划如下:https://explain.depesz.com/s/EJgOq

编辑 - 更新以添加depesz链接。编辑2 - 添加了有关查询的更多信息。

postgresql database-performance
1个回答
2
投票

缓慢的原因是错误的行计数估计值使PostgreSQL选择嵌套循环连接。几乎所有的时间都用在hfj_res_link的索引扫描中,重复1113次。

我的第一次尝试将是ANALYZE hfj_spidx_date,看看是否有帮助。如果是,请确保自动分析更频繁地处理该表。

下一次尝试将是

SET default_statistics_target = 1000;

然后ANALYZE如上。如果这有帮助,使用ALTER TABLE增加STATISTICShash_identity列上的sp_value_high

如果这也没有帮助,并且您有最新版本的PostgreSQL,您可以尝试扩展统计信息:

CREATE STATISTICS myparamsda2_stats (dependencies)
   ON hash_identity, sp_value_high FROM hfj_spidx_date;

然后再次ANALYZE表,看看是否有帮助。

如果所有这些都无济于事,并且您无法正确估算,则必须尝试不同的角度:

CREATE INDEX ON hfj_res_link (target_resource_id, src_resource_id);

这应该会大大加快索引扫描并为您提供良好的响应时间。

最后,如果上述方法都没有任何效果,您可以使用禁止嵌套循环连接的粗略度量来进行此查询:

BEGIN;
SET LOCAL enable_nestloop = off;
SELECT /* your query goes here */;
COMMIT;
© www.soinside.com 2019 - 2024. All rights reserved.