生成列
StarRocks 自 3.1 版本起支持生成列(Generated Column)。该特性支持预先计算并存储表达式的结果,从而加速包含复杂表达式的查询,并且支持查询改写,因此极大提高了查询性能。
您可以定义一个或者多个生成列来存储表达式的结果。当执行包含相同表达式的查询时,优化器会进行查询改写,用生成列替换表达式。或者您也可以直接查询生成列的数据。
不过需要注意的是,导入数据至具有生成列的表时,因为 StarRocks 需要额外计算出表达式的结果并写入生成列,耗时和开销可能会有所增大。
StarRocks 存算分离模式暂时不支持该功能。
基本用法
创建生成列
语法
col_name data_type [NULL] AS generation_expr [COMMENT 'string']
建表时创建生成列
创建表 test_tbl1
,包含五列,其中列 newcol1
和 newcol2
是生成列,分别是引用普通列 data_array
和 data_json
通过计算表达式后生成的列。
CREATE TABLE test_tbl1
(
id INT NOT NULL,
data_array ARRAY<int> NOT NULL,
data_json JSON NOT NULL,
newcol1 DOUBLE AS array_avg(data_array),
newcol2 String AS json_string(json_query(data_json, "$.a"))
)
PRIMARY KEY (id)
DISTRIBUTED BY HASH(id);
注意事项:
- 生成列必须在普通列之后。
- 生成列的表达式不支持使用聚合函数。
- 生成列的表达式中不能引用其他生成列或自增列,可以引用多个普通列。
- 生成列的数据类型必须与表达式返回结果的数据类型相匹配。
- 不支持在聚合表创建生成列。