区别于巨大的巢穴

区别于巨大的巢穴

我有一个具有intarrayfeature_value_ids的物化视图(大约10万行)。我想要的是根据物化视图的一些条件从该列中选择所有唯一的id
这个查询运行正常。30毫秒,约100万行:

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

但是,如果添加DISTINCT,查询将下降到~400ms,给出~5k行
SELECT DISTINCT unnest(feature_value_ids) FROM dematerialized_products
WHERE is_private = 'f' AND product_category_ids && ARRAY [38]

我试图做一个递归查询,但没有成功(~35s),如下所示:
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每次递归查询都在计算

最佳答案

您没有显示执行计划,但很明显,时间是用来对值进行排序以消除双重值。
如果EXPLAIN (ANALYZE)显示排序是使用临时文件执行的,则可以通过提升work_mem来提高性能,以便可以在内存中执行排序。
使用DISTINCT时,您仍将体验到性能上的冲击。

关于postgresql - 区别于巨大的巢穴,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44130280/

10-13 08:03