Skip to main content

关联关系(join)

在本文我们聊聊如何在 RisingWave 内对数据流做关联关系。

在使用传统数据库时,用户可以在:

  • 表(table)与表
  • 表与物化视图
  • 物化视图与物化视图

之间做随机关联关系查询。与传统数据库相比,RisingWave 不仅支持这类随机查询, 而且还支持连续流计算。而由于 RisingWave 还支持 source,用户实际可以在表、物化视图、source三者之间做关联关系。

举个例子。假设我们有以下定义:

create table t1 with (...);
create table t2 with (...);
create source s1 with (...);
create source s2 with (...);
create materialized view mv1 as select ...;
create materialized view mv2 as select ...;

那我们可以做以下随机查询:

select ... from t1, t2 where ...;
select ... from t1, mv1 where ...;
...

而以下查询不被允许:

select ... from t1, s1 where ...;
select ... from s1, mv1 where ...;

原因很简单,正如我们在之前章节所提到的,RisingWave 的 source 不会持久化数据,因此不能被用户直接进行随机查询。

以下连续流计算均可被支持:

create materialized view m1 as 
select ... from t1, t2 where ...;
create materialized view m2 as
select ... from t1, mv1 where ...;
create materialized view m3 as
select ... from t1, s1 where ...;
create materialized view m4 as
select ... from s1, mv1 where ...;

有了这些基本概念,我们开始探究一下 RisingWave 所支持的关联关系种类。

常用关联关系

在 PostgreSQL 中,最常用的关联关系包括:

  • Inner join
  • Left join
  • Right join
  • Full outer join
  • Natural Join
  • Cross Join
  • Self Join

RisingWave 支持对所有这些关联关系进行随机查询,但并不支持对部分关联关系进行连续查询。为什么? 原因是,在流计算中,带有 nested loop join 的查询复杂度过高,导致性能过差,且较少真实使用场景,因此不能支持。

支持随机查询
(select 语句)
支持连续查询
(create materialized view 语句)
Inner joinjoin 条件必须为等于
Left joinjoin 条件必须为等于
Right joinjoin 条件必须为等于
Full outer joinjoin 条件必须为等于
Natural join
Corss join
Self joinjoin 条件必须为等于

如果用户的确想在流计算查询中使用非等于关联关系,则可以考虑使用动态过滤(dynamic filtering)