400-800-0824
info@ymatrix.cn
400-800-0824
info@ymatrix.cn
400-800-0824
info@ymatrix.cn
400-800-0824
info@ymatrix.cn
400-800-0824
info@ymatrix.cn
YMatrix 文档
关于 YMatrix
标准集群部署
数据写入
SQL 参考
依据存储引擎的不同特性,你可以在不同的场景需求下灵活创建不同的表。我们给出以下示例。
MARS2 表依赖 matrixts
扩展,在建表前,首先需要你在使用该存储引擎的数据库中创建扩展。
注意!
matrixts
扩展为数据库级别,一个数据库里面创建一次即可,无需重复创建。
CREATE EXTENSION matrixts;
建表时使用 USING MARS2
来指定存储引擎,基本建表示例如下。
CREATE TABLE mars2(
time timestamp with time zone,
tag_id int,
i4 int4,
i8 int8
)
USING MARS2;
我们延伸至以下车联网时序场景示例进行进一步说明。
CREATE TABLE vehicle_basic_data_mars2(
daq_time timestamp encoding (minmax),
vin varchar(32) COLLATE "C" encoding (minmax),
lng float encoding (minmax),
lat float encoding (minmax),
speed float ,
license_template varchar(16) ,
flag integer
)
USING MARS2
WITH (compresstype=zstd, compresslevel=3)
DISTRIBUTED BY (vin)
PARTITION BY RANGE (daq_time)
( START ('2022-07-01 00:00:00') INCLUSIVE
END ('2022-08-01 00:00:00') EXCLUSIVE
EVERY (INTERVAL '1 day')
,default partition others);
创建 MARS2 表成功后,你必须额外创建一个 mars2_btree 类型的索引,这样才能进行正常的数据读写。使用索引排序的目的是使得同一维度或相似特性的数据尽可能的在物理上靠近,以减少 I/O 寻址的次数,提高查询效率。因此排序键的选择需要符合主要的业务查询特征。例如需求是单设备点查询,那么排序键就是时序场景中的设备号(vin),如果需求是单设备在某时间段内明细查询、聚集查询或多设备查询,那么排序键就是设备号以及时间戳(vin,daq_time)。
CREATE INDEX idx_mars2 ON vehicle_basic_data_mars2
USING mars2_btree(vin, daq_time) WITH(uniquemode = true);
结合上述示例表中的具体参数和语句,做最佳实践说明:
注意!
我们希冀你会根据我们的建议设计建表思路,但我们不希望你盲目套用。具体的时序场景千变万化,具体情况具体分析仍是非常必要的。
(vin, daq_time)
。WHERE
条件过滤时需要加上这个选项。WHERE daq_time >= CURRENT_DATE - INTERVAL '1 day'
,这样数据库就会快速的判断出数据在哪个分区子表上,从而快速的将数据定位并查询表出来。START...END
语句以及INCLUSIVE
、EXCLUSIVE
关键字创建从 2022-07-01 零点开始到 2022-08-01 零点前截止的子分区表。注意!
当设备相同时间点数据分批上报时,MARS2 可以对相同时间(此表中为 daq_time 值)相同设备(此表中为 vin 值)的数据进行合并。合并特性需要在创建索引时手动指定uniquemode=true
,因为此选项的默认值是false
。例如,当你指定uniquemode=true
,设备 'A01' 在 '2022-01-01 00:00:00' 这个时间传回来 3 条数据,最后会根据最后一条数据将原来的两条数据覆盖,只保留一条数据;但如果你默认了uniquemode=false
,那么设备 'A01' 在 '2022-01-01 00:00:00' 这个时间传回来的 3 条数据,最后会全部保留,不做任何处理。
HEAP 表为 YMatrix 默认存储引擎,因此如果你建表时没有特殊指定存储引擎,创建的则均为 HEAP 表。
CREATE TABLE disk_heap(
time timestamp with time zone,
tag_id int,
read float,
write float
)
DISTRIBUTED BY (tag_id);
AORO 表即行存的 AO 表。行存是 AO 表的默认存储方式。
AORO 支持表级别的压缩,不支持列级别的压缩。
CREATE TABLE disk_aoro(
time timestamp with time zone,
tag_id int,
read float,
write float
)
WITH(appendonly=true,orientation=row,compresstype=zlib,compresslevel=4)
DISTRIBUTED BY (tag_id);
AOCO 表即列存的 AO 表。
AOCO 即支持表级别的压缩,又支持列级别的压缩。
CREATE TABLE disk_aoco(
time timestamp with time zone,
tag_id int ENCODING(compresstype=zlib,compresslevel=5),
read float,
write float
)
WITH(appendonly=true,orientation=column,compresstype=zlib,compresslevel=6)
DISTRIBUTED BY (tag_id);
确定使用 HEAP 还是 AO 表的最佳实践是: