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