Postgres查询的生产速度很慢,暂存和本地查询都很快

时间:2019-06-07 15:34:45

标签: sql postgresql heroku

我对此不知所措。我有一个很大的查询,看起来像这样:

SELECT *
FROM some_table
WHERE some_id IN (hundreds, perhaps even thousands of ids)

由于某种原因,尽管该查询对于我们大多数用户来说运行得相当快,但我们有一个或两个帐户运行得如此缓慢,以至于遇到超时错误(Heroku)。我认为它必须与这些用户的特定数据有关,但是,当我将生产数据库的副本放在我们的登台服务器上时,这些相同的查询运行得很快(不到2秒)。我还对本地计算机上的数据进行了相同的测试:快速。

所有三个环境都在运行Postgres11。我一辈子都无法弄清楚是什么原因造成的。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

如果查询的结果是“数百个,甚至数千个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 

并确保您在表some_table列some_id上​​有正确的索引

答案 1 :(得分:0)

很多时候加入values列表比IN列表快:

SELECT st.*
FROM some_table st 
  JOIN ( 
     values (1), (2), (3), (4)
  ) t(id) on st.some_id = t.id;

请注意,与IN列表相比,值列表的格式不同。 IN (1,2,3)成为values (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;