针对产品表中的某些过滤子条件,我想找出被过滤的产品(数百万个产品)的不同类别。
明确的方法是:
SELECT DISTINCT category_id FROM "products" WHERE _conditions_
当涉及到大量行时,完成时间很长(使用 GROUP BY
并没有真正改变太多)。
根据https://wiki.postgresql.org/wiki/Loose_indexscan,当唯一列上只有相对较少的不同值(例如此处约为30个类别),条件是:
SELECT DISTINCT category_id FROM "products"
可以重述为递归CTE
WITH RECURSIVE t AS (
SELECT MIN(category_id) AS category_id FROM "products"
UNION ALL
SELECT (SELECT MIN(category_id) FROM "products" WHERE category_id > t.category_id)
FROM t WHERE t.category_id IS NOT NULL
)
SELECT category_id FROM t WHERE category_id IS NOT NULL
UNION ALL
SELECT NULL WHERE EXISTS(SELECT 1 FROM "products" WHERE category_id IS NULL);
在我的使用情况下,实际上表现更好(毫秒而不是秒)。但它没有条件。
如何正确地将“WHERE _conditions_
”部分添加到递归CTE中?