在维表DDL语法中增加1行PERIOD FOR SYSTEM_TIME的声明,定义维表的变化周期,即可使用标准的CREATE TABLE语法定义实时计算维表。
示例
CREATE TABLE white_list (
id varchar,
name varchar,
age int,
PRIMARY KEY (id),
PERIOD FOR SYSTEM_TIME --定义维表的变化周期。实时计算3.x及以上版本,维表DDL中可以不声明该句,在维表JOIN时,声明FOR SYSTEM_TIME AS OF PROCTIME()即可。
) with (
type = 'RDS',
...
);
说明
- 维表必须指定主键。维表JOIN时,ON的条件必须包含所有主键的等值条件。
- 目前仅支持源表
INNER JOIN
或LEFT JOIN
维表。 - 维表的唯一键(UK)必须为数据库表中的唯一键。如果维表声明的唯一键不是数据库表的唯一键会产生以下影响:
- 维表的读取速度变慢。
- 在维表JOIN时,会从第一条数据进行JOIN,在加入Job的过程中,相同KEY的多条记录在数据库中按顺序发生变化,可能导致JOIN结果错误。
INDEX语法
说明 建议在实时计算2.2.7及以上版本使用
INDEX
语法。
实时计算2.2以下版本,维表定义要求声明
PRIMARY KEY
,这种情况下只能实现一对一连接。为支持一对多连接的需求,引入了INDEX
语法。非Cache All
的维表JOIN通过INDEX LOOKUP
的方式实现一对多连接的需求。 CREATE TABLE Persons (
ID bigint,
LastName varchar,
FirstName varchar,
Nick varchar,
Age int,
[UNIQUE] INDEX(LastName,FirstName,Nick), --定义INDEX,不需要指定具体的类型,例如,fulltext或clustered等。
PERIOD FOR SYSTEM_TIME
) with (
type='RDS',
...
);
UNIQUE INDEX
表示一对一连接,而INDEX
表示一对多连接。
说明
- 实时计算2.2.7及以后版本支持
UNIQUE CONSTRAINT
(UNIQUE KEY
),实时计算2.2.7以下版本可以使用PRIMARY KEY
的定义。 - 在生成执行计划时,引擎优先采用
UNIQUE INDEX
。即如果DDL中使用INDEX,但JOIN等值连接条件中同时包含UNIQUE
和NON-UNIQUE INDEX
时,优先使用UNIQUE INDEX
查找右表数据。 - 支持一对多连接的维表类型,例如RDS和MaxCompute。
- 您可以增加
maxJoinRows
参数,表示在一对多连接时,左表一条记录连接右表的最大记录数(默认值为1024)。在一对多连接的记录数过多时,可能会极大的影响流任务的性能,因此您需要增大Cache的内存(cacheSize
限制的是左表key的个数)。 - 表格存储Tablestore和Hologres维表不支持使用INDEX进行一对多JOIN。
维表、源表和结果表的区别
类别 | 源表 | 结果表 | 维表 |
---|---|---|---|
是否能驱动计算 | 是 | 否 | 否 |
是否能读取数据 | 是,直接读取。 | 否 | 是,仅通过源表和维表JOIN读取。 |
是否能写入数据 | 否 | 是 | 否 |
是否支持Cache | 否 | 否 | 是 |