簡體   English   中英

在 Oracle 中運行速度極慢的 Postgres 查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM