Skip to main content

动态过滤器

动态过滤器的作用相当于过滤操作符,但动态过滤器的过滤条件中包含动态变量。它们能够实时过滤数据流,并允许定义一个条件,来决定哪些进入的数据需要被处理。

一个有效的动态过滤器包含以下组件:

  • 一个比较操作符,包括 <><=>=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 > maxproducts 表中的 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 就是使用动态过滤器实现的。作为内部状态操作符,动态过滤器在过滤前保持一个完整的结果集,并决定哪些更改应该被输出。