0

J'ai une vue matérialisée (~ 100k lignes) avec une colonne intarrayfeature_value_ids. Ce que je veux est de sélectionner tous les identifiants uniques de cette colonne, en fonction de certaines conditions sur la vue matérialiséeDISTINCT sur énorme unnest

Cette requête s'exécute ok, aprox. 30 ms, ce qui donne ~ 1 lignes de mil:

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

Cependant, si j'ajoute DISTINCT, requête tombe à ~ 400ms, donnant ~ 5k lignes

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

J'ai essayé de faire une requête récursive sans chance (~ 35s), comme ceci:

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 

Je suppose que cela est dû au fait z évalue chaque fois que requête récursive ne

Répondre

1

Vous n'avez pas montré les plans d'exécution, mais il est évident que le temps est passé à trier les valeurs pour éliminer les doubles.

Si EXPLAIN (ANALYZE) montre que le tri est effectué à l'aide de fichiers temporaires, vous pouvez améliorer les performances en élevant work_mem afin que le tri puisse être effectué en mémoire.

Vous rencontrerez toujours un succès de performance avec DISTINCT.

1

Les valeurs de tableau featured_value_id sont-elles uniques à l'intérieur du tableau? Si non, cela fait-il une différence si vous donnez un petit coup de main au planificateur en le rendant unique?:

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