Sql Postgres查询生产速度慢,登台和本地查询速度快
我在这件事上不知所措。我有一个相当大的查询,如下所示:Sql Postgres查询生产速度慢,登台和本地查询速度快,sql,postgresql,heroku,Sql,Postgresql,Heroku,我在这件事上不知所措。我有一个相当大的查询,如下所示: SELECT * FROM some_table WHERE some_id IN (hundreds, perhaps even thousands of ids) 出于某种原因,虽然对于大多数用户来说,这个查询运行得相当快,但我们有一两个帐户的运行速度非常慢,以至于我们遇到了超时错误(Heroku)。我认为它一定与那些用户的特定数据有关,但是,当我将生产数据库的副本放在登台服务器上时,这些精确的查询运行得很快(
SELECT *
FROM some_table
WHERE some_id IN (hundreds, perhaps even thousands of ids)
出于某种原因,虽然对于大多数用户来说,这个查询运行得相当快,但我们有一两个帐户的运行速度非常慢,以至于我们遇到了超时错误(Heroku)。我认为它一定与那些用户的特定数据有关,但是,当我将生产数据库的副本放在登台服务器上时,这些精确的查询运行得很快(<2秒)。我还在本地机器上测试了数据,效果相同:快速
这三个环境都在运行Postgres 11。我一辈子都搞不清楚是什么原因造成的
有什么想法吗?如果您的“数百个,甚至数千个ID”是查询的结果,那么您可以避免in子句,使用内部联接
SELECT *
FROM some_table
INNER JOIN (
select id from my_table /* for hundreds, perhaps even thousands of ids */
) t on t.id = some_table.some_id
并确保在表中的某些表列中有适当的索引某些id通常连接到
值列表比IN列表快:
SELECT st.*
FROM some_table st
JOIN (
values (1), (2), (3), (4)
) t(id) on st.some_id = t.id;
请注意,值列表的格式与输入列表的格式不同<(1,2,3)中的代码>变成值(1)、(2)、(3)
或者,可以使用公共表表达式而不是派生表
with id_list (id) as (
values (1), (2), (3), (4)
)
select st.*
from some_table st
join id_list i on i.id = st.some_id;
捕获三种环境中的执行计划。如何获得“数百个,甚至数千个ID”。。是选择/子查询吗?@scaisEdge通过单独的选择查询更好地解释。。显示代码。。please@StephenCorwin . . . 您可能需要更新生产服务器上的表/数据库统计信息:。