1、Colocate join
shuffle join 和 broadcast join 中,参与 join 的两张表的数据行,若满足 join 条件,则需要将它们汇合在一个节点上,完成 join。这两种 join 方式,都无法避免节点间数据网络传输带来额外的延迟和其他开销。 而 colocation join 则可避免数据网络传输开销,核心思想是将同一个 Colocation Group 中表,采用一致的分桶键、一致的副本数量和一致副本放置方式,因此如果 join 列为分桶键,则计算节点只需做本地 join 即可,无须从其他节点获取数据。
例如:创建两张测试表,并标记同一个group属性,让表与表join可以得到优化。并且两张表桶的个数保持一致。
CREATE TABLE `tbl1` (
`k1` date NOT NULL COMMENT "",
`k2` int(11) NOT NULL COMMENT "",
`v1` int(11) SUM NOT NULL COMMENT ""
) ENGINE=OLAP
AGGREGATE KEY(`k1`, `k2`)
DISTRIBUTED BY HASH(`k2`) BUCKETS 8
PROPERTIES (
"colocate_with" = "group1"
);
CREATE TABLE `tbl2` (
`k1` date NOT NULL COMMENT "",
`k2` int(11) NOT NULL COMMENT "",
`v1` int(11) SUM NOT NULL COMMENT ""
) ENGINE=OLAP
AGGREGATE KEY(`k1`, `k2`)
DISTRIBUTED BY HASH(`k2`) BUCKETS 8
PROPERTIES (
"colocate_with" = "group1"
);
创建表之后再进行两表join,并可以使用explain进行分析。如果优化生效执行计划里可看到colocate为true。
explain SELECT * FROM tbl1 INNER JOIN tbl2 ON (tbl1.k2 = tbl2.k2);
2、外部表
StarRocks支持以外部表的形式,接入其他数据源。外部表指的是保存在其他数据源中的数据表,而StartRocks只保存表对应的元数据,并直接向外部表所在数据源发起查询。目前StarRocks已支持的第三方数据源包括MySQL、ElasticSearch、Hive以及StarRocks。对于StarRocks数据源,现阶段只支持Insert写入,不支持读取,对于其他数据源,现阶段只支持读取,还不支持写入。
2.1、MySql外部表
星型模型中,数据一般划分为维度表和事实表。维度表数据量少,但会涉及 UPDATE 操作。目前 StarRocks 中还不直接支持 UPDATE 操作(可以通过 Unique 数据模型实现),在一些场景下,可以把维度表存储在 MySQL 中,查询时直接读取维度表。
-- 登录mysql,先创建测试表
CREATE TABLE test_t1(
id INT,
`name` VARCHAR(20),
age INT);
-- 插入测试数据
INSERT INTO test_t1 VALUES(1001,'张三',14),(1002,'李四',15),(1003,'王五',16);
-- 登录starrocks,创建mysql外部表
create external table mysql_t1(
id int,
name varchar(20),
age int)
ENGINE=mysql
PROPERTIES
(
"host" = "hadoop2",
"port" = "3306",
"user" = "root",
"password" = "123456",
"database" = "mydb",
"table" = "test_t1"
);
-- 查询mysql外部表,可以直接查询到数据
select *from mysql_t1;
当mysql表中的数据有做修改,会实时同步,并且当mysql中的数据发生修改时,starrocks也会实时同步。如下所示:
2.2、Hive外部表
3、数组
字段类型,数组。在建表时指定字段类型。
使用一维数组:
-- 使用一维数组
create table t0(
c0 INT,
c1 ARRAY<INT>
)
duplicate key(c0)
distributed by hash(c0) buckets 3;
-- 插入数据
INSERT INTO t0 VALUES(1, [1,2,3]);
-- 如果要查询数组列的具体某个值,可用下标的方式取值,注意下标从1开始。比如我要查询[1,2,3]中的2,sql语句如下
select c1[2] from t0;
使用嵌套数组:
-- 创建测试表
create table t1(
c0 INT,
c1 ARRAY<ARRAY<VARCHAR(10)>>
)
duplicate key(c0)
distributed by hash(c0) buckets 3;
-- 插入数据
INSERT INTO t1 VALUES(1, [[1,2,3],[1,2,3],[4,5,6]]);
-- 查询数据(3)查询数据,同样比如要查询[[1,2,3],[1,2,3],[4,5,6]]要查询其中的5,那就是下标为3中的数组下标为2的数值
select c1[3][2] from t1;
使用限制:
- 只能在duplicate table中定义数组列
- 数组列不能作为key列(以后可能支持)
- 数组列不能作为distribution列
- 数组列不能作为partition列