0

intarrayfeature_value_idsのマテリアライズドビュー(~100k行)があります。私が望むのは、マテリアライズド・ビューでのいくつかの条件に基づいて、その列からすべてのユニークIDを選択することです。DISTINCT以上の膨大なネストなし

この問合せはok、aproxで実行されます。 30ミリ秒〜1つのミルの行を与える:〜を与える、〜私はDISTINCT追加した場合、クエリはに落ちる。しかし、5kの行

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

を400msのを

SELECT 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 
関連する問題