【发布时间】:2019-02-13 21:43:21
【问题描述】:
我的数据库需要很长时间才能完成此查询。此 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 - 添加了有关查询的更多信息。
【问题讨论】:
-
请edit您的问题并将执行计划添加为formatted text,该屏幕截图无法阅读。或者将其上传到explain.depesz.com 为有问题的表添加
create table语句,包括所有索引也会有所帮助。 -
不要在末尾的“ where ”子句中使用“ in ”子句,而是可以做另一个连接条件吗?我不知道你从哪里得到那串数字,但我认为字符串搜索,特别是如果不是有序字符串列表,可能是关键放缓。
-
我经常发现,如果你将
where some_table.col1 in (1,2,3)重写为join (values (1),(2),(3) ) as t(x) on some_table.col1 = t.x在 Postgres 中更快——尤其是对于非常大的 IN 列表 -
感谢您的反馈 - 我添加了此链接:explain.depesz.com/s/EJgOq
标签: postgresql database-performance