我对此不知所措。我有一个很大的查询,看起来像这样:
SELECT *
FROM some_table
WHERE some_id IN (hundreds, perhaps even thousands of ids)
由于某种原因,尽管该查询对于我们大多数用户来说运行得相当快,但我们有一个或两个帐户运行得如此缓慢,以至于遇到超时错误(Heroku)。我认为它必须与这些用户的特定数据有关,但是,当我将生产数据库的副本放在我们的登台服务器上时,这些相同的查询运行得很快(不到2秒)。我还对本地计算机上的数据进行了相同的测试:快速。
所有三个环境都在运行Postgres11。我一辈子都无法弄清楚是什么原因造成的。
有什么想法吗?
答案 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;