【发布时间】:2020-11-11 16:50:46
【问题描述】:
因此,在对 Oracle 有一些经验后,我才开始在 PostgreSQL 中工作,并且我有这个查询,在 Oracle 中返回 200 毫秒,在 Postgres 中返回 1.40 分钟。罪魁祸首似乎是
AND product_cost_view.product_type_id = product.product_type_id
当我删除这部分或使用某些 ID 硬编码 product_cost_view.product_type_id 时,它运行得很快。解释计划似乎没有给予和洞察力,它只是说INDEX SCAN ON TABLE product TOTAL COST 776403 1913 ROWS。
是的,product_cost_view 是一个视图,我还指出,如果我用一个也有 product_type_id 的表替换该视图,那么它也可以快速运行。我尝试以 100 种不同的形式使用 CTE 和 subselects,但是当我在 where 子句中使用 product.product_type_id 时,它的运行速度非常慢,我看不到我错过了什么。提前致谢 :)
附言是的,我在两个数据库中都有完全相同的数据和索引
SELECT COUNT(*)
FROM product
WHERE user_id = 1000000
AND (product_id IN (SELECT DISTINCT product_id
FROM product_cost_view
WHERE user_id = 1000000
AND cost_type = 'X'
AND product_cost_view.product_type_id = product.product_type_id)
);
【问题讨论】:
-
请注意,子查询中的
distinct完全没用。 Oracle 可能会优化它,但我认为 Postgres 不会 -
请edit您的问题并添加使用
explain (analyze, buffers, format text)生成的execution plan(不是只是一个“简单”解释)为formatted text,并确保保留计划的缩进。粘贴文本,然后将```放在计划前一行和计划后一行。还请包括所有索引的完整create index语句。
标签: sql postgresql query-performance