![](/img/trans.png)
[英]A slow query in Oracle (runs fast in SQL Server) (a correlated subquery)
[英]Extremely slow Postgres query that runs fast in Oracle
所以我剛剛開始在 PostgreSQL 中工作,在一些 Oracle 經驗之后,我有這個查詢,在 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 的表替換該視圖,那么它也可以快速運行。 我嘗試使用CTE
和 100 種不同形式的子subselects
,但是當我在帶有該視圖的 where 子句中使用那個 product.product_type_id 時,它的工作速度非常慢,我看不到我錯過了什么。 提前致謝:) PS 是的,我在兩個數據庫中有完全相同的數據和索引
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
,PostgreSQL 無法將子查詢展平為連接,因此您正在為product
找到的每一行運行子查詢。
很難在沒有看到執行計划的情況下肯定地說,但這應該更快:
SELECT COUNT(*)
FROM product AS p
WHERE p.user_id = 1000000
AND EXISTS (SELECT 1 FROM product_cost_view AS pc
WHERE pc.product_type_id = p.product_type_id
AND pc.product_id = p.product_id
AND pc.user_id = 1000000
AND pc.cost_type = 'X');
你能試試這個變體嗎:
SELECT COUNT(DISTINCT P.product_id)
FROM product P
INNER JOIN product_cost_view PC
ON P.product_id = PC.product_id
AND P.user_id = PC.user_id
AND P.product_type_id = PC.product_type_id
WHERE P.user_id = 1000000
AND PC.cost_type = 'X'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.