通过 id 字符串的 PostgreSQL CTE 非常便宜,但是通过查询的 id 非常昂贵

问题描述 投票:0回答:1

我直接在查询中使用id,它成本低

-- Query 1.
-- Nested Loop Semi Join  (cost=2.27..280.78 rows=1 width=129)
EXPLAIN SELECT *
FROM view_companies_extra
WHERE company_id iN (
  SELECT id
  FROM companies
  WHERE id = 'cddba3ad-dd13-48bb-a5b0-f0e325f27d51'
);

并且如果我使用查询中的id,我会得到更高的成本?

-- Query 2.
-- Seq Scan on companies  (cost=0.00..18581.05 rows=1 width=16)
--  Filter: ((number)::text = '7731394650'::text)
EXPLAIN SELECT id
FROM companies
WHERE number = '7731394650';

-- Query 3.
-- Nested Loop  (cost=3.10..10324011.11 rows=12 width=129)
EXPLAIN SELECT *
FROM view_companies_extra
WHERE company_id IN (
  SELECT id
  FROM companies
  WHERE number = '7731394650'
);

如果你运行“查询2”来获取id,然后在查询“查询1”中使用它,它应该会非常快。

但是当我将所有这些合并到一个“查询 3”中时,需要花费非常长的时间。这是为什么?

Postgres 13.10 和 13.14。

postgresql common-table-expression postgresql-13 query-planner
1个回答
0
投票

在查询 1 中,您将尝试使用具有主索引的 id 选择公司,但在查询 3 中,您尝试通过另一个字段查找,可能没有定义索引,因此您可以针对该字段定义索引,然后使用查询 3。

© www.soinside.com 2019 - 2024. All rights reserved.