0

我有一個intarrayfeature_value_ids物化視圖(~100k行)。我想要的是根據物化視圖上的某些條件從該列中選擇所有唯一標識DISTINCT over huge unnest

此查詢運行正常,aprox。 30毫秒,讓〜1萬行:

SELECT unnest(feature_value_ids) FROM dematerialized_products    
WHERE is_private = 'f' AND product_category_ids && ARRAY [38] 

不過,如果我添加DISTINCT,查詢降至〜400毫秒,從而〜5K行

SELECT DISTINCT unnest(feature_value_ids) FROM dematerialized_products    
WHERE is_private = 'f' AND product_category_ids && ARRAY [38] 

我試圖做一個遞歸查詢,沒有運氣(〜35秒),像這樣:

WITH RECURSIVE t AS (
    (SELECT min(value_id) AS value_id FROM z) 
    UNION ALL 
    SELECT (SELECT min(value_id) FROM z WHERE value_id > t.value_id) AS value_id 
    FROM t 
     WHERE t.value_id IS NOT NULL 
), z as (
    SELECT unnest(feature_value_ids) as value_id 
    FROM dematerialized_products a 
    WHERE is_private = 'f' AND product_category_ids && ARRAY [38] 
) 

SELECT * FROM t WHERE t.value_id IS NOT NULL 

我想這是因爲z是,在每次評估遞歸查詢並

回答

1

您沒有顯示執行計劃,但顯然時間花在對值進行排序以消除雙打。

如果EXPLAIN (ANALYZE)顯示使用臨時文件執行排序,則可以通過提高work_mem來提高性能,以便可以在內存中執行排序。

您仍然會遇到DISTINCT的性能問題。

1

featured_value_id數組值在數組內是唯一的嗎?如果不是這樣,如果你通過讓它們變得獨一無二,讓計劃者有點小手,那麼它會產生什麼影響?:

select distinct c.id 
from 
    dematerialized_products 
    cross join lateral 
    (
     select distinct id 
     from unnest(feature_value_ids) u (id) 
    ) c