Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Postgres查询生产速度慢,登台和本地查询速度快_Sql_Postgresql_Heroku - Fatal编程技术网

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 . . . 您可能需要更新生产服务器上的表/数据库统计信息:。