【发布时间】:2017-05-23 09:00:58
【问题描述】:
我有一个带有intarray 列feature_value_ids 的物化视图(~ 100k 行)。我想要的是根据物化视图上的某些条件从该列中选择所有唯一 ID
此查询运行正常,大约。 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 每次递归查询都会进行评估
【问题讨论】:
标签: postgresql distinct common-table-expression recursive-query