动态过滤器
动态过滤器的作用相当于过滤操作符,但动态过滤器的过滤条件中包含动态变量。它们能够实时过滤数据流,并允许定义一个条件,来决定哪些进入的数据需要被处理。
一个有效的动态过滤器包含以下组件:
- 一个比较操作符,包括
<
、>
、<=
、>=
和BETWEEN
- 左侧为一个列
- 右侧为一个标量子查询
此外,动态过滤条件不能是 OR
表达式的一部分。例如,v > (select max(v) from t2) OR a > 0
是无效的。
以下是一个示例查询,返回利润率高于 sales
表中最大利润的产品名称。
WITH max_profit AS (SELECT max(profit_margin) max FROM sales)
SELECT product_name FROM products, max_profit
WHERE product_profit > max;
此查询中的动态过滤器位于 WHERE
子句中。过滤条件 product_profit > max
将 products
表中的 product_profit
列与 sales
表中 profit_margin
列的最大值进行比较,该最大值存储在子查询 max_profit
中。最大利润率的值是动态的,这个值会根据 sales
表中的值变化。
以下是一个示例,用于查询成本超过总支出的 0.01% 的部件。
CREATE MATERIALIZED VIEW mv1 AS
SELECT
ps_partkey,
sum(ps_supplycost * ps_availqty) AS value
FROM
partsupp
GROUP BY
ps_partkey
HAVING
sum(ps_supplycost * ps_availqty) > (
SELECT
sum(ps_supplycost * ps_availqty) * 0.0001
FROM
partsupp
)
对于以上例子,RisingWave 在内部通过一个持续的流式作业来维护这个物化视图,该作业根据 HAVING
子句过滤聚合结果。注意,子查询结果,即总成本的 0.01%,是不断变化的,随着 partsupp
表的更改而增加或减少。
随着这个值的增加,更多的结果将满足这一条件并被输出;相反,随着这个值的减少,更多行被过滤掉,输出的结果也会减少。
以上这个过程,RisingWave 就是使用动态过滤器实现的。作为内部状态操作符,动态过滤器在过滤前保持一个完整的结果集,并决定哪些更改应该被输出。