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