我有一个具有intarray
列feature_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/