测点管理
数据库管理
数据库(Database)可以被视为关系数据库中的Database。
创建数据库
我们可以根据存储模型建立相应的数据库。如下所示:
1. IoTDB > CREATE DATABASE root.ln
需要注意的是,推荐创建一个 database.
Database 的父子节点都不能再设置 database。例如在已经有root.ln和root.sgcc这两个 database 的情况下,创建root.ln.wf01 database 是不可行的。系统将给出相应的错误提示,如下所示:
1. IoTDB> CREATE DATABASE root.ln.wf01
2. Msg: 300: root.ln has already been created as database.
Database 节点名命名规则:
- 节点名可由中英文字符、数字、下划线(_)、英文句号(.)、反引号(`) 组成
- 若节点名为以下情况,则必须用反引号(`) 将整个名称包裹。
- 纯数字(如 12345)
- 含有特殊字符(如 . 或 _)并可能引发歧义的名称(如 db.01、_temp)
- 反引号的特殊处理:
若节点名本身需要包含反引号(
),则需用**两个反引号(``)** 表示一个反引号。例如:命名为db123本身包含一个反引号),需写为 `db123。
还需注意,如果在 Windows 系统上部署,database 名是大小写不敏感的。例如同时创建root.ln 和 root.LN 是不被允许的。
查看数据库
在 database 创建后,我们可以使用 SHOW DATABASES 语句和 SHOW DATABASES <PathPattern> 来查看 database,SQL 语句如下所示:
1. IoTDB> show databases
2. IoTDB> show databases root.*
3. IoTDB> show databases root.**
执行结果为:
1. +-------------+----+-------------------------+-----------------------+-----------------------+
2. | database| ttl|schema_replication_factor|data_replication_factor|time_partition_interval|
3. +-------------+----+-------------------------+-----------------------+-----------------------+
4. | root.sgcc|null| 2| 2| 604800|
5. | root.ln|null| 2| 2| 604800|
6. +-------------+----+-------------------------+-----------------------+-----------------------+
7. Total line number = 2
8. It costs 0.060s
删除数据库
用户可以使用DELETE DATABASE <PathPattern>语句删除该路径模式匹配的所有的数据库。在删除的过程中,需要注意的是数据库的数据也会被删除。
1. IoTDB > DELETE DATABASE root.ln
2. IoTDB > DELETE DATABASE root.sgcc
3. // 删除所有数据,时间序列以及数据库
4. IoTDB > DELETE DATABASE root.**
统计数据库数量
用户可以使用COUNT DATABASES <PathPattern>语句统计数据库的数量,允许指定PathPattern 用来统计匹配该PathPattern 的数据库的数量
SQL 语句如下所示:
1. IoTDB> show databases
2. IoTDB> count databases
3. IoTDB> count databases root.*
4. IoTDB> count databases root.sgcc.*
5. IoTDB> count databases root.sgcc
执行结果为:
1. +-------------+
2. | database|
3. +-------------+
4. | root.sgcc|
5. | root.turbine|
6. | root.ln|
7. +-------------+
8. Total line number = 3
9. It costs 0.003s
11. +-------------+
12. | Database|
13. +-------------+
14. | 3|
15. +-------------+
16. Total line number = 1
17. It costs 0.003s
19. +-------------+
20. | Database|
21. +-------------+
22. | 3|
23. +-------------+
24. Total line number = 1
25. It costs 0.002s
27. +-------------+
28. | Database|
29. +-------------+
30. | 0|
31. +-------------+
32. Total line number = 1
33. It costs 0.002s
35. +-------------+
36. | database|
37. +-------------+
38. | 1|
39. +-------------+
40. Total line number = 1
41. It costs 0.002s
数据保留时间(TTL)
IoTDB 支持对设备(device)级别设置数据保留时间(TTL),允许系统自动定期删除旧数据,以有效控制磁盘空间并维护高性能查询和低内存占用。TTL 默认以毫秒为单位,数据过期后不可查询且禁止写入,但物理删除会延迟至压缩时。需注意,TTL 变更可能导致短暂数据可查询性变化,且若调小或解除 TTL,之前因 TTL 不可见的数据可能重新出现。
注意事项:
- TTL 设置为毫秒,不受配置文件时间精度影响。
- TTL 变更可能影响数据的可查询性。
- 系统最终会移除过期数据,但存在延迟。
- TTL 判断数据是否过期依据的是数据点时间,非写入时间。
- 系统最多支持设置 1000 条 TTL 规则,达到上限需先删除部分规则才能设置新规则。
TTL Path 规则
设置的路径 path 只支持前缀路径(即路径中间不能带 * , 且必须以 ** 结尾),该路径会匹配到设备,也允许用户指定不带星的 path 为具体的 database 或 device,当 path 不带 * 时,会检查是否匹配到 database,若匹配到 database,则会同时设置 path 和 path.**。 注意:设备 TTL 设置不会对元数据的存在性进行校验,即允许对一条不存在的设备设置 TTL。
1. 合格的 path:
2. root.**
3. root.db.**
4. root.db.group1.**
5. root.db
6. root.db.group1.d1
8. 不合格的 path:
9. root.*.db
10. root.**.db.*
11. root.db.*
TTL 适用规则
当一个设备适用多条TTL规则时,优先适用较精确和较长的规则。例如对于设备“root.bj.hd.dist001.turbine001”来说,规则“root.bj.hd.dist001.turbine001”比“root.bj.hd.dist001.**”优先,而规则“root.bj.hd.dist001.**”比“root.bj.hd.**”优先;
设置 TTL
set ttl 操作可以理解为设置一条 TTL规则,比如 set ttl to root.sg.group1.** 就相当于对所有可以匹配到该路径模式的设备挂载 ttl。 unset ttl 操作表示对相应路径模式卸载 TTL,若不存在对应 TTL,则不做任何事。若想把 TTL 调成无限大,则可以使用 INF 关键字 设置 TTL 的 SQL 语句如下所示:
1. set ttl to pathPattern 360000;
pathPattern 是前缀路径,即路径中间不能带 * 且必须以 ** 结尾。 pathPattern 匹配对应的设备。为了兼容老版本 SQL 语法,允许用户输入的 pathPattern 匹配到 db,则自动将前缀路径扩展为 path.**。 例如,写set ttl to root.sg 360000 则会自动转化为set ttl to root.sg.** 360000,转化后的语句对所有 root.sg 下的 device 设置TTL。 但若写的 pathPattern 无法匹配到 db,则上述逻辑不会生效。 如写set ttl to root.sg.group 360000 ,由于root.sg.group未匹配到 db,则不会被扩充为root.sg.group.**。 也允许指定具体 device,不带 *。
取消 TTL
取消 TTL 的 SQL 语句如下所示:
1. IoTDB> unset ttl from root.ln
取消设置 TTL 后, root.ln 路径下所有的数据都会被保存。
1. IoTDB> unset ttl from root.sgcc.**
取消设置root.sgcc路径下的所有的 TTL 。
1. IoTDB> unset ttl from root.**
取消设置所有的 TTL 。
新语法
1. IoTDB> unset ttl from root.**
旧语法
1. IoTDB> unset ttl to root.**
新旧语法在功能上没有区别并且同时兼容,仅是新语法在用词上更符合常规。
显示 TTL
显示 TTL 的 SQL 语句如下所示: show all ttl
1. IoTDB> SHOW ALL TTL
2. +--------------+--------+
3. | path| TTL|
4. | root.**|55555555|
5. | root.sg2.a.**|44440000|
6. +--------------+--------+
show ttl on pathPattern
1. IoTDB> SHOW TTL ON root.db.**;
2. +--------------+--------+
3. | path| TTL|
4. | root.db.**|55555555|
5. | root.db.a.**|44440000|
6. +--------------+--------+
SHOW ALL TTL 这个例子会给出所有的 TTL。 SHOW TTL ON pathPattern 这个例子会显示指定路径的 TTL。
显示设备的 TTL。
1. IoTDB> show devices
2. +---------------+---------+---------+
3. | Device|IsAligned| TTL|
4. +---------------+---------+---------+
5. |root.sg.device1| false| 36000000|
6. |root.sg.device2| true| INF|
7. +---------------+---------+---------+
所有设备都一定会有 TTL,即不可能是 null。INF 表示无穷大。
设置异构数据库(进阶操作)
在熟悉 IoTDB 元数据建模的前提下,用户可以在 IoTDB 中设置异构的数据库,以便应对不同的生产需求。
目前支持的数据库异构参数有:
| 参数名 | 参数类型 | 参数描述 |
|---|---|---|
| TTL | Long | 数据库的 TTL |
| SCHEMA_REPLICATION_FACTOR | Integer | 数据库的元数据副本数 |
| DATA_REPLICATION_FACTOR | Integer | 数据库的数据副本数 |
| SCHEMA_REGION_GROUP_NUM | Integer | 数据库的 SchemaRegionGroup 数量 |
| DATA_REGION_GROUP_NUM | Integer | 数据库的 DataRegionGroup 数量 |
用户在配置异构参数时需要注意以下三点:
- TTL 和 TIME_PARTITION_INTERVAL 必须为正整数。
- SCHEMA_REPLICATION_FACTOR 和 DATA_REPLICATION_FACTOR 必须小于等于已部署的 DataNode 数量。
- SCHEMA_REGION_GROUP_NUM 和 DATA_REGION_GROUP_NUM 的功能与 iotdb-system.properties 配置文件中的
schema_region_group_extension_policy和data_region_group_extension_policy参数相关,以 DATA_REGION_GROUP_NUM 为例: 若设置data_region_group_extension_policy=CUSTOM,则 DATA_REGION_GROUP_NUM 将作为 Database 拥有的 DataRegionGroup 的数量; 若设置data_region_group_extension_policy=AUTO,则 DATA_REGION_GROUP_NUM 将作为 Database 拥有的 DataRegionGroup 的配额下界,即当该 Database 开始写入数据时,将至少拥有此数量的 DataRegionGroup。
用户可以在创建 Database 时设置任意异构参数,或在单机/分布式 IoTDB 运行时调整部分异构参数。
创建 Database 时设置异构参数
用户可以在创建 Database 时设置上述任意异构参数,SQL 语句如下所示:
1. CREATE DATABASE prefixPath (WITH databaseAttributeClause (COMMA? databaseAttributeClause)*)?
例如:
1. CREATE DATABASE root.db WITH SCHEMA_REPLICATION_FACTOR=1, DATA_REPLICATION_FACTOR=3, SCHEMA_REGION_GROUP_NUM=1, DATA_REGION_GROUP_NUM=2;
运行时调整异构参数
用户可以在 IoTDB 运行时调整部分异构参数,SQL 语句如下所示:
1. ALTER DATABASE prefixPath WITH databaseAttributeClause (COMMA? databaseAttributeClause)*
例如:
1. ALTER DATABASE root.db WITH SCHEMA_REGION_GROUP_NUM=1, DATA_REGION_GROUP_NUM=2;
注意,运行时只能调整下列异构参数:
- SCHEMA_REGION_GROUP_NUM
- DATA_REGION_GROUP_NUM
查看异构数据库
用户可以查询每个 Database 的具体异构配置,SQL 语句如下所示:
1. SHOW DATABASES DETAILS prefixPath?
例如:
1. IoTDB> SHOW DATABASES DETAILS
2. +--------+--------+-----------------------+---------------------+---------------------+--------------------+-----------------------+-----------------------+------------------+---------------------+---------------------+
3. |Database| TTL|SchemaReplicationFactor|DataReplicationFactor|TimePartitionInterval|SchemaRegionGroupNum|MinSchemaRegionGroupNum|MaxSchemaRegionGroupNum|DataRegionGroupNum|MinDataRegionGroupNum|MaxDataRegionGroupNum|
4. +--------+--------+-----------------------+---------------------+---------------------+--------------------+-----------------------+-----------------------+------------------+---------------------+---------------------+
5. |root.db1| null| 1| 3| 604800000| 0| 1| 1| 0| 2| 2|
6. |root.db2|86400000| 1| 1| 604800000| 0| 1| 1| 0| 2| 2|
7. |root.db3| null| 1| 1| 604800000| 0| 1| 1| 0| 2| 2|
8. +--------+--------+-----------------------+---------------------+---------------------+--------------------+-----------------------+-----------------------+------------------+---------------------+---------------------+
9. Total line number = 3
10. It costs 0.058s
各列查询结果依次为:
- 数据库名称
- 数据库的 TTL
- 数据库的元数据副本数
- 数据库的数据副本数
- 数据库的时间分区间隔
- 数据库当前拥有的 SchemaRegionGroup 数量
- 数据库需要拥有的最小 SchemaRegionGroup 数量
- 数据库允许拥有的最大 SchemaRegionGroup 数量
- 数据库当前拥有的 DataRegionGroup 数量
- 数据库需要拥有的最小 DataRegionGroup 数量
- 数据库允许拥有的最大 DataRegionGroup 数量
设备模板管理
IoTDB 支持设备模板功能,实现同类型不同实体的物理量元数据共享,减少元数据内存占用,同时简化同类型实体的管理。

img

img
创建设备模板
创建设备模板的 SQL 语法如下:
1. CREATE DEVICE TEMPLATE <templateName> ALIGNED? '(' <measurementId> <attributeClauses> [',' <measurementId> <attributeClauses>]+ ')'
示例1: 创建包含两个非对齐序列的元数据模板
1. IoTDB> create device template t1 (temperature FLOAT encoding=RLE, status BOOLEAN encoding=PLAIN compression=SNAPPY)
示例2: 创建包含一组对齐序列的元数据模板
1. IoTDB> create device template t2 aligned (lat FLOAT encoding=Gorilla, lon FLOAT encoding=Gorilla)
其中,物理量 lat 和 lon 是对齐的。
挂载设备模板
元数据模板在创建后,需执行挂载操作,方可用于相应路径下的序列创建与数据写入。
挂载模板前,需确保相关数据库已经创建。
推荐将模板挂载在 database 节点上,不建议将模板挂载到 database 上层的节点上。
模板挂载路径下禁止创建普通序列,已创建了普通序列的前缀路径上不允许挂载模板。
挂载元数据模板的 SQL 语句如下所示:
1. IoTDB> set device template t1 to root.sg1.d1
激活设备模板
挂载好设备模板后,且系统开启自动注册序列功能的情况下,即可直接进行数据的写入。例如 database 为 root.sg1,模板 t1 被挂载到了节点 root.sg1.d1,那么可直接向时间序列(如 root.sg1.d1.temperature 和 root.sg1.d1.status)写入时间序列数据,该时间序列已可被当作正常创建的序列使用。
注意:在插入数据之前或系统未开启自动注册序列功能,模板定义的时间序列不会被创建。可以使用如下SQL语句在插入数据前创建时间序列即激活模板:
1. IoTDB> create timeseries using device template on root.sg1.d1
示例: 执行以下语句
1. IoTDB> set device template t1 to root.sg1.d1
2. IoTDB> set device template t2 to root.sg1.d2
3. IoTDB> create timeseries using device template on root.sg1.d1
4. IoTDB> create timeseries using device template on root.sg1.d2
查看此时的时间序列:
1. show timeseries root.sg1.**
1. +-----------------------+-----+-------------+--------+--------+-----------+----+----------+--------+-------------------+
2. | timeseries|alias| database|dataType|encoding|compression|tags|attributes|deadband|deadband parameters|
3. +-----------------------+-----+-------------+--------+--------+-----------+----+----------+--------+-------------------+
4. |root.sg1.d1.temperature| null| root.sg1| FLOAT| RLE| SNAPPY|null| null| null| null|
5. | root.sg1.d1.status| null| root.sg1| BOOLEAN| PLAIN| SNAPPY|null| null| null| null|
6. | root.sg1.d2.lon| null| root.sg1| FLOAT| GORILLA| SNAPPY|null| null| null| null|
7. | root.sg1.d2.lat| null| root.sg1| FLOAT| GORILLA| SNAPPY|null| null| null| null|
8. +-----------------------+-----+-------------+--------+--------+-----------+----+----------+--------+-------------------+
查看此时的设备:
1. show devices root.sg1.**
1. +---------------+---------+---------+
2. | devices|isAligned| Template|
3. +---------------+---------+---------+
4. | root.sg1.d1| false| null|
5. | root.sg1.d2| true| null|
6. +---------------+---------+---------+
查看设备模板
- 查看所有设备模板
SQL 语句如下所示:
1. IoTDB> show device templates
执行结果如下:
1. +-------------+
2. |template name|
3. +-------------+
4. | t2|
5. | t1|
6. +-------------+
- 查看某个设备模板下的物理量
SQL 语句如下所示:
1. IoTDB> show nodes in device template t1
执行结果如下:
1. +-----------+--------+--------+-----------+
2. |child nodes|dataType|encoding|compression|
3. +-----------+--------+--------+-----------+
4. |temperature| FLOAT| RLE| SNAPPY|
5. | status| BOOLEAN| PLAIN| SNAPPY|
6. +-----------+--------+--------+-----------+
- 查看挂载了某个设备模板的路径
1. IoTDB> show paths set device template t1
执行结果如下:
1. +-----------+
2. |child paths|
3. +-----------+
4. |root.sg1.d1|
5. +-----------+
- 查看使用了某个设备模板的路径(即模板在该路径上已激活,序列已创建)
1. IoTDB> show paths using device template t1
执行结果如下:
1. +-----------+
2. |child paths|
3. +-----------+
4. |root.sg1.d1|
5. +-----------+
解除设备模板
若需删除模板表示的某一组时间序列,可采用解除模板操作,SQL语句如下所示:
1. IoTDB> delete timeseries of device template t1 from root.sg1.d1
或
1. IoTDB> deactivate device template t1 from root.sg1.d1
解除操作支持批量处理,SQL语句如下所示:
1. IoTDB> delete timeseries of device template t1 from root.sg1.*, root.sg2.*
或
1. IoTDB> deactivate device template t1 from root.sg1.*, root.sg2.*
若解除命令不指定模板名称,则会将给定路径涉及的所有模板使用情况均解除。
卸载设备模板
卸载设备模板的 SQL 语句如下所示:
1. IoTDB> unset device template t1 from root.sg1.d1
注意:不支持卸载仍处于激活状态的模板,需保证执行卸载操作前解除对该模板的所有使用,即删除所有该模板表示的序列。
删除设备模板
删除设备模板的 SQL 语句如下所示:
1. IoTDB> drop device template t1
注意:不支持删除已经挂载的模板,需在删除操作前保证该模板卸载成功。
修改设备模板
在需要新增物理量的场景中,可以通过修改设备模板来给所有已激活该模板的设备新增物理量。
修改设备模板的 SQL 语句如下所示:
1. IoTDB> alter device template t1 add (speed FLOAT encoding=RLE)
向已挂载模板的路径下的设备中写入数据,若写入请求中的物理量不在模板中,将自动扩展模板。
时间序列管理
创建时间序列
根据建立的数据模型,我们可以分别在两个数据库中创建相应的时间序列。创建时间序列的 SQL 语句如下所示:
1. IoTDB > create timeseries root.ln.wf01.wt01.status with datatype=BOOLEAN,encoding=PLAIN
2. IoTDB > create timeseries root.ln.wf01.wt01.temperature with datatype=FLOAT,encoding=RLE
3. IoTDB > create timeseries root.ln.wf02.wt02.hardware with datatype=TEXT,encoding=PLAIN
4. IoTDB > create timeseries root.ln.wf02.wt02.status with datatype=BOOLEAN,encoding=PLAIN
5. IoTDB > create timeseries root.sgcc.wf03.wt01.status with datatype=BOOLEAN,encoding=PLAIN
6. IoTDB > create timeseries root.sgcc.wf03.wt01.temperature with datatype=FLOAT,encoding=RLE
从 v0.13 起,可以使用简化版的 SQL 语句创建时间序列:
1. IoTDB > create timeseries root.ln.wf01.wt01.status BOOLEAN encoding=PLAIN
2. IoTDB > create timeseries root.ln.wf01.wt01.temperature FLOAT encoding=RLE
3. IoTDB > create timeseries root.ln.wf02.wt02.hardware TEXT encoding=PLAIN
4. IoTDB > create timeseries root.ln.wf02.wt02.status BOOLEAN encoding=PLAIN
5. IoTDB > create timeseries root.sgcc.wf03.wt01.status BOOLEAN encoding=PLAIN
6. IoTDB > create timeseries root.sgcc.wf03.wt01.temperature FLOAT encoding=RLE
需要注意的是,当创建时间序列时指定的编码方式与数据类型不对应时,系统会给出相应的错误提示,如下所示:
1. IoTDB> create timeseries root.ln.wf02.wt02.status WITH DATATYPE=BOOLEAN, ENCODING=TS_2DIFF
2. error: encoding TS_2DIFF does not support BOOLEAN
详细的数据类型与编码方式的对应列表请参见 编码方式。
创建对齐时间序列
创建一组对齐时间序列的SQL语句如下所示:
1. IoTDB> CREATE ALIGNED TIMESERIES root.ln.wf01.GPS(latitude FLOAT encoding=PLAIN compressor=SNAPPY, longitude FLOAT encoding=PLAIN compressor=SNAPPY)
一组对齐序列中的序列可以有不同的数据类型、编码方式以及压缩方式。
对齐的时间序列也支持设置别名、标签、属性。
删除时间序列
我们可以使用(DELETE | DROP) TimeSeries <PathPattern>语句来删除我们之前创建的时间序列。SQL 语句如下所示:
1. IoTDB> delete timeseries root.ln.wf01.wt01.status
2. IoTDB> delete timeseries root.ln.wf01.wt01.temperature, root.ln.wf02.wt02.hardware
3. IoTDB> delete timeseries root.ln.wf02.*
4. IoTDB> drop timeseries root.ln.wf02.*
查看时间序列
- SHOW LATEST? TIMESERIES pathPattern? timeseriesWhereClause? limitClause?
SHOW TIMESERIES 中可以有四种可选的子句,查询结果为这些时间序列的所有信息
时间序列信息具体包括:时间序列路径名,database,Measurement 别名,数据类型,编码方式,压缩方式,属性和标签。
示例:
- SHOW TIMESERIES
展示系统中所有的时间序列信息
- SHOW TIMESERIES <Path>
返回给定路径的下的所有时间序列信息。其中 Path 需要为一个时间序列路径或路径模式。例如,分别查看root路径和root.ln路径下的时间序列,SQL 语句如下所示:
1. IoTDB> show timeseries root.**
2. IoTDB> show timeseries root.ln.**
执行结果分别为:
1. +-------------------------------+--------+-------------+--------+--------+-----------+-------------------------------------------+--------------------------------------------------------+--------+-------------------+
2. | timeseries| alias| database|dataType|encoding|compression| tags| attributes|deadband|deadband parameters|
3. +-------------------------------+--------+-------------+--------+--------+-----------+-------------------------------------------+--------------------------------------------------------+--------+-------------------+
4. |root.sgcc.wf03.wt01.temperature| null| root.sgcc| FLOAT| RLE| SNAPPY| null| null| null| null|
5. | root.sgcc.wf03.wt01.status| null| root.sgcc| BOOLEAN| PLAIN| SNAPPY| null| null| null| null|
6. | root.turbine.d1.s1|newAlias| root.turbine| FLOAT| RLE| SNAPPY|{"newTag1":"newV1","tag4":"v4","tag3":"v3"}|{"attr2":"v2","attr1":"newV1","attr4":"v4","attr3":"v3"}| null| null|
7. | root.ln.wf02.wt02.hardware| null| root.ln| TEXT| PLAIN| SNAPPY| null| null| null| null|
8. | root.ln.wf02.wt02.status| null| root.ln| BOOLEAN| PLAIN| SNAPPY| null| null| null| null|
9. | root.ln.wf01.wt01.temperature| null| root.ln| FLOAT| RLE| SNAPPY| null| null| null| null|
10. | root.ln.wf01.wt01.status| null| root.ln| BOOLEAN| PLAIN| SNAPPY| null| null| null| null|
11. +-------------------------------+--------+-------------+--------+--------+-----------+-------------------------------------------+--------------------------------------------------------+--------+-------------------+
12. Total line number = 7
13. It costs 0.016s
15. +-----------------------------+-----+-------------+--------+--------+-----------+----+----------+--------+-------------------+
16. | timeseries|alias| database|dataType|encoding|compression|tags|attributes|deadband|deadband parameters|
17. +-----------------------------+-----+-------------+--------+--------+-----------+----+----------+--------+-------------------+
18. | root.ln.wf02.wt02.hardware| null| root.ln| TEXT| PLAIN| SNAPPY|null| null| null| null|
19. | root.ln.wf02.wt02.status| null| root.ln| BOOLEAN| PLAIN| SNAPPY|null| null| null| null|
20. |root.ln.wf01.wt01.temperature| null| root.ln| FLOAT| RLE| SNAPPY|null| null| null| null|
21. | root.ln.wf01.wt01.status| null| root.ln| BOOLEAN| PLAIN| SNAPPY|null| null| null| null|
22. +-----------------------------+-----+-------------+--------+--------+-----------+----+----------+--------+-------------------+
23. Total line number = 4
24. It costs 0.004s
- SHOW TIMESERIES LIMIT INT OFFSET INT
只返回从指定下标开始的结果,最大返回条数被 LIMIT 限制,用于分页查询。例如:
1. show timeseries root.ln.** limit 10 offset 10
- SHOW TIMESERIES WHERE TIMESERIES contains ‘containStr’
对查询结果集根据 timeseries 名称进行字符串模糊匹配过滤。例如:
1. show timeseries root.ln.** where timeseries contains 'wf01.wt'
执行结果为:
1. +-------------------------------+--------+-------------+--------+--------+-----------+-------------------------------------------+--------------------------------------------------------+--------+-------------------+
2. | timeseries| alias| database|dataType|encoding|compression| tags| attributes|deadband|deadband parameters|
3. +-------------------------------+--------+-------------+--------+--------+-----------+-------------------------------------------+--------------------------------------------------------+--------+-------------------+
4. | root.ln.wf01.wt01.temperature| null| root.ln| FLOAT| RLE| SNAPPY| null| null| null| null|
5. | root.ln.wf01.wt01.status| null| root.ln| BOOLEAN| PLAIN| SNAPPY| null| null| null| null|
6. +-------------------------------+--------+-------------+--------+--------+-----------+-------------------------------------------+--------------------------------------------------------+--------+-------------------+
7. Total line number = 2
8. It costs 0.016s
- SHOW TIMESERIES WHERE DataType=type
对查询结果集根据时间序列数据类型进行过滤。例如:
1. show timeseries root.ln.** where dataType=FLOAT
执行结果为:
1. +-------------------------------+--------+-------------+--------+--------+-----------+-------------------------------------------+--------------------------------------------------------+--------+-------------------+
2. | timeseries| alias| database|dataType|encoding|compression| tags| attributes|deadband|deadband parameters|
3. +-------------------------------+--------+-------------+--------+--------+-----------+-------------------------------------------+--------------------------------------------------------+--------+-------------------+
4. |root.sgcc.wf03.wt01.temperature| null| root.sgcc| FLOAT| RLE| SNAPPY| null| null| null| null|
5. | root.turbine.d1.s1|newAlias| root.turbine| FLOAT| RLE| SNAPPY|{"newTag1":"newV1","tag4":"v4","tag3":"v3"}|{"attr2":"v2","attr1":"newV1","attr4":"v4","attr3":"v3"}| null| null|
6. | root.ln.wf01.wt01.temperature| null| root.ln| FLOAT| RLE| SNAPPY| null| null| null| null|
7. +-------------------------------+--------+-------------+--------+--------+-----------+-------------------------------------------+--------------------------------------------------------+--------+-------------------+
8. Total line number = 3
9. It costs 0.016s
- SHOW TIMESERIES WHERE TAGS(KEY) = VALUE
- SHOW TIMESERIES WHERE TAGS(KEY) CONTAINS VALUE
对查询结果集根据标签进行过滤。例如:
1. show timeseries root.ln.** where TAGS(unit)='c'
2. show timeseries root.ln.** where TAGS(description) contains 'test1'
执行结果分别为:
1. +--------------------------+-----+-------------+--------+--------+-----------+------------+----------+--------+-------------------+
2. | timeseries|alias| database|dataType|encoding|compression| tags|attributes|deadband|deadband parameters|
3. +--------------------------+-----+-------------+--------+--------+-----------+------------+----------+--------+-------------------+
4. |root.ln.wf02.wt02.hardware| null| root.ln| TEXT| PLAIN| SNAPPY|{"unit":"c"}| null| null| null|
5. +--------------------------+-----+-------------+--------+--------+-----------+------------+----------+--------+-------------------+
6. Total line number = 1
7. It costs 0.005s
9. +------------------------+-----+-------------+--------+--------+-----------+-----------------------+----------+--------+-------------------+
10. | timeseries|alias| database|dataType|encoding|compression| tags|attributes|deadband|deadband parameters|
11. +------------------------+-----+-------------+--------+--------+-----------+-----------------------+----------+--------+-------------------+
12. |root.ln.wf02.wt02.status| null| root.ln| BOOLEAN| PLAIN| SNAPPY|{"description":"test1"}| null| null| null|
13. +------------------------+-----+-------------+--------+--------+-----------+-----------------------+----------+--------+-------------------+
14. Total line number = 1
15. It costs 0.004s
- SHOW LATEST TIMESERIES
表示查询出的时间序列需要按照最近插入时间戳降序排列
需要注意的是,当查询路径不存在时,系统会返回 0 条时间序列。
统计时间序列总数
IoTDB 支持使用COUNT TIMESERIES<Path>来统计一条路径中的时间序列个数。SQL 语句如下所示:
- 可以通过
WHERE条件对时间序列名称进行字符串模糊匹配,语法为:COUNT TIMESERIES <Path> WHERE TIMESERIES contains 'containStr'。 - 可以通过
WHERE条件对时间序列数据类型进行过滤,语法为:COUNT TIMESERIES <Path> WHERE DataType=<DataType>'。 - 可以通过
WHERE条件对标签点进行过滤,语法为:COUNT TIMESERIES <Path> WHERE TAGS(key)='value'或COUNT TIMESERIES <Path> WHERE TAGS(key) contains 'value'。 - 可以通过定义
LEVEL来统计指定层级下的时间序列个数。这条语句可以用来统计每一个设备下的传感器数量,语法为:COUNT TIMESERIES <Path> GROUP BY LEVEL=<INTEGER>。
1. IoTDB > COUNT TIMESERIES root.**
2. IoTDB > COUNT TIMESERIES root.ln.**
3. IoTDB > COUNT TIMESERIES root.ln.*.*.status
4. IoTDB > COUNT TIMESERIES root.ln.wf01.wt01.status
5. IoTDB > COUNT TIMESERIES root.** WHERE TIMESERIES contains 'sgcc'
6. IoTDB > COUNT TIMESERIES root.** WHERE DATATYPE = INT64
7. IoTDB > COUNT TIMESERIES root.** WHERE TAGS(unit) contains 'c'
8. IoTDB > COUNT TIMESERIES root.** WHERE TAGS(unit) = 'c'
9. IoTDB > COUNT TIMESERIES root.** WHERE TIMESERIES contains 'sgcc' group by level = 1
例如有如下时间序列(可以使用show timeseries展示所有时间序列):
1. +-------------------------------+--------+-------------+--------+--------+-----------+-------------------------------------------+--------------------------------------------------------+--------+-------------------+
2. | timeseries| alias| database|dataType|encoding|compression| tags| attributes|deadband|deadband parameters|
3. +-------------------------------+--------+-------------+--------+--------+-----------+-------------------------------------------+--------------------------------------------------------+--------+-------------------+
4. |root.sgcc.wf03.wt01.temperature| null| root.sgcc| FLOAT| RLE| SNAPPY| null| null| null| null|
5. | root.sgcc.wf03.wt01.status| null| root.sgcc| BOOLEAN| PLAIN| SNAPPY| null| null| null| null|
6. | root.turbine.d1.s1|newAlias| root.turbine| FLOAT| RLE| SNAPPY|{"newTag1":"newV1","tag4":"v4","tag3":"v3"}|{"attr2":"v2","attr1":"newV1","attr4":"v4","attr3":"v3"}| null| null|
7. | root.ln.wf02.wt02.hardware| null| root.ln| TEXT| PLAIN| SNAPPY| {"unit":"c"}| null| null| null|
8. | root.ln.wf02.wt02.status| null| root.ln| BOOLEAN| PLAIN| SNAPPY| {"description":"test1"}| null| null| null|
9. | root.ln.wf01.wt01.temperature| null| root.ln| FLOAT| RLE| SNAPPY| null| null| null| null|
10. | root.ln.wf01.wt01.status| null| root.ln| BOOLEAN| PLAIN| SNAPPY| null| null| null| null|
11. +-------------------------------+--------+-------------+--------+--------+-----------+-------------------------------------------+--------------------------------------------------------+--------+-------------------+
12. Total line number = 7
13. It costs 0.004s
那么 Metadata Tree 如下所示:

可以看到,root被定义为LEVEL=0。那么当你输入如下语句时:
1. IoTDB > COUNT TIMESERIES root.** GROUP BY LEVEL=1
2. IoTDB > COUNT TIMESERIES root.ln.** GROUP BY LEVEL=2
3. IoTDB > COUNT TIMESERIES root.ln.wf01.* GROUP BY LEVEL=2
你将得到以下结果:
1. IoTDB> COUNT TIMESERIES root.** GROUP BY LEVEL=1
2. +------------+-----------------+
3. | column|count(timeseries)|
4. +------------+-----------------+
5. | root.sgcc| 2|
6. |root.turbine| 1|
7. | root.ln| 4|
8. +------------+-----------------+
9. Total line number = 3
10. It costs 0.002s
12. IoTDB > COUNT TIMESERIES root.ln.** GROUP BY LEVEL=2
13. +------------+-----------------+
14. | column|count(timeseries)|
15. +------------+-----------------+
16. |root.ln.wf02| 2|
17. |root.ln.wf01| 2|
18. +------------+-----------------+
19. Total line number = 2
20. It costs 0.002s
22. IoTDB > COUNT TIMESERIES root.ln.wf01.* GROUP BY LEVEL=2
23. +------------+-----------------+
24. | column|count(timeseries)|
25. +------------+-----------------+
26. |root.ln.wf01| 2|
27. +------------+-----------------+
28. Total line number = 1
29. It costs 0.002s
注意:时间序列的路径只是过滤条件,与 level 的定义无关。
标签点管理
我们可以在创建时间序列的时候,为它添加别名和额外的标签和属性信息。
标签和属性的区别在于:
- 标签可以用来查询时间序列路径,会在内存中维护标点到时间序列路径的倒排索引:标签 -> 时间序列路径
- 属性只能用时间序列路径来查询:时间序列路径 -> 属性
所用到的扩展的创建时间序列的 SQL 语句如下所示:
1. create timeseries root.turbine.d1.s1(temprature) with datatype=FLOAT, encoding=RLE, compression=SNAPPY tags(tag1=v1, tag2=v2) attributes(attr1=v1, attr2=v2)
括号里的temprature是s1这个传感器的别名。
我们可以在任何用到s1的地方,将其用temprature代替,这两者是等价的。
IoTDB 同时支持在查询语句中使用 AS 函数设置别名。二者的区别在于:AS 函数设置的别名用于替代整条时间序列名,且是临时的,不与时间序列绑定;而上文中的别名只作为传感器的别名,与其绑定且可与原传感器名等价使用。
注意:额外的标签和属性信息总的大小不能超过
tag_attribute_total_size.
- 标签点属性更新 创建时间序列后,我们也可以对其原有的标签点属性进行更新,主要有以下六种更新方式:
- 重命名标签或属性
1. ALTER timeseries root.turbine.d1.s1 RENAME tag1 TO newTag1
- 重新设置标签或属性的值
1. ALTER timeseries root.turbine.d1.s1 SET newTag1=newV1, attr1=newV1
- 删除已经存在的标签或属性
1. ALTER timeseries root.turbine.d1.s1 DROP tag1, tag2
- 添加新的标签
1. ALTER timeseries root.turbine.d1.s1 ADD TAGS tag3=v3, tag4=v4
- 添加新的属性
1. ALTER timeseries root.turbine.d1.s1 ADD ATTRIBUTES attr3=v3, attr4=v4
- 更新插入别名,标签和属性
如果该别名,标签或属性原来不存在,则插入,否则,用新值更新原来的旧值
1. ALTER timeseries root.turbine.d1.s1 UPSERT ALIAS=newAlias TAGS(tag2=newV2, tag3=v3) ATTRIBUTES(attr3=v3, attr4=v4)
- 使用标签作为过滤条件查询时间序列,使用 TAGS(tagKey) 来标识作为过滤条件的标签
1. SHOW TIMESERIES (<`PathPattern`>)? timeseriesWhereClause
返回给定路径的下的所有满足条件的时间序列信息,SQL 语句如下所示:
1. ALTER timeseries root.ln.wf02.wt02.hardware ADD TAGS unit=c
2. ALTER timeseries root.ln.wf02.wt02.status ADD TAGS description=test1
3. show timeseries root.ln.** where TAGS(unit)='c'
4. show timeseries root.ln.** where TAGS(description) contains 'test1'
执行结果分别为:
1. +--------------------------+-----+-------------+--------+--------+-----------+------------+----------+--------+-------------------+
2. | timeseries|alias| database|dataType|encoding|compression| tags|attributes|deadband|deadband parameters|
3. +--------------------------+-----+-------------+--------+--------+-----------+------------+----------+--------+-------------------+
4. |root.ln.wf02.wt02.hardware| null| root.ln| TEXT| PLAIN| SNAPPY|{"unit":"c"}| null| null| null|
5. +--------------------------+-----+-------------+--------+--------+-----------+------------+----------+--------+-------------------+
6. Total line number = 1
7. It costs 0.005s
9. +------------------------+-----+-------------+--------+--------+-----------+-----------------------+----------+--------+-------------------+
10. | timeseries|alias| database|dataType|encoding|compression| tags|attributes|deadband|deadband parameters|
11. +------------------------+-----+-------------+--------+--------+-----------+-----------------------+----------+--------+-------------------+
12. |root.ln.wf02.wt02.status| null| root.ln| BOOLEAN| PLAIN| SNAPPY|{"description":"test1"}| null| null| null|
13. +------------------------+-----+-------------+--------+--------+-----------+-----------------------+----------+--------+-------------------+
14. Total line number = 1
15. It costs 0.004s
- 使用标签作为过滤条件统计时间序列数量
1. COUNT TIMESERIES (<`PathPattern`>)? timeseriesWhereClause
2. COUNT TIMESERIES (<`PathPattern`>)? timeseriesWhereClause GROUP BY LEVEL=<INTEGER>
返回给定路径的下的所有满足条件的时间序列的数量,SQL 语句如下所示:
1. count timeseries
2. count timeseries root.** where TAGS(unit)='c'
3. count timeseries root.** where TAGS(unit)='c' group by level = 2
执行结果分别为:
1. IoTDB> count timeseries
2. +-----------------+
3. |count(timeseries)|
4. +-----------------+
5. | 6|
6. +-----------------+
7. Total line number = 1
8. It costs 0.019s
9. IoTDB> count timeseries root.** where TAGS(unit)='c'
10. +-----------------+
11. |count(timeseries)|
12. +-----------------+
13. | 2|
14. +-----------------+
15. Total line number = 1
16. It costs 0.020s
17. IoTDB> count timeseries root.** where TAGS(unit)='c' group by level = 2
18. +--------------+-----------------+
19. | column|count(timeseries)|
20. +--------------+-----------------+
21. | root.ln.wf02| 2|
22. | root.ln.wf01| 0|
23. |root.sgcc.wf03| 0|
24. +--------------+-----------------+
25. Total line number = 3
26. It costs 0.011s
注意,现在我们只支持一个查询条件,要么是等值条件查询,要么是包含条件查询。当然 where 子句中涉及的必须是标签值,而不能是属性值。
创建对齐时间序列
1. create aligned timeseries root.sg1.d1(s1 INT32 tags(tag1=v1, tag2=v2) attributes(attr1=v1, attr2=v2), s2 DOUBLE tags(tag3=v3, tag4=v4) attributes(attr3=v3, attr4=v4))
执行结果如下:
1. IoTDB> show timeseries
2. +--------------+-----+-------------+--------+--------+-----------+-------------------------+---------------------------+--------+-------------------+
3. | timeseries|alias| database|dataType|encoding|compression| tags| attributes|deadband|deadband parameters|
4. +--------------+-----+-------------+--------+--------+-----------+-------------------------+---------------------------+--------+-------------------+
5. |root.sg1.d1.s1| null| root.sg1| INT32| RLE| SNAPPY|{"tag1":"v1","tag2":"v2"}|{"attr2":"v2","attr1":"v1"}| null| null|
6. |root.sg1.d1.s2| null| root.sg1| DOUBLE| GORILLA| SNAPPY|{"tag4":"v4","tag3":"v3"}|{"attr4":"v4","attr3":"v3"}| null| null|
7. +--------------+-----+-------------+--------+--------+-----------+-------------------------+---------------------------+--------+-------------------+
支持查询:
1. IoTDB> show timeseries where TAGS(tag1)='v1'
2. +--------------+-----+-------------+--------+--------+-----------+-------------------------+---------------------------+--------+-------------------+
3. | timeseries|alias| database|dataType|encoding|compression| tags| attributes|deadband|deadband parameters|
4. +--------------+-----+-------------+--------+--------+-----------+-------------------------+---------------------------+--------+-------------------+
5. |root.sg1.d1.s1| null| root.sg1| INT32| RLE| SNAPPY|{"tag1":"v1","tag2":"v2"}|{"attr2":"v2","attr1":"v1"}| null| null|
6. +--------------+-----+-------------+--------+--------+-----------+-------------------------+---------------------------+--------+-------------------+
上述对时间序列标签、属性的更新等操作都支持。
路径查询
查看路径的所有子路径
1. SHOW CHILD PATHS pathPattern
可以查看此路径模式所匹配的所有路径的下一层的所有路径和它对应的节点类型,即pathPattern.*所匹配的路径及其节点类型。
节点类型:ROOT -> SG INTERNAL -> DATABASE -> INTERNAL -> DEVICE -> TIMESERIES
示例:
- 查询 root.ln 的下一层:show child paths root.ln
1. +------------+----------+
2. | child paths|node types|
3. +------------+----------+
4. |root.ln.wf01| INTERNAL|
5. |root.ln.wf02| INTERNAL|
6. +------------+----------+
7. Total line number = 2
8. It costs 0.002s
- 查询形如 root.xx.xx.xx 的路径:show child paths root.*.*
1. +---------------+
2. | child paths|
3. +---------------+
4. |root.ln.wf01.s1|
5. |root.ln.wf02.s2|
6. +---------------+
查看路径的下一级节点
1. SHOW CHILD NODES pathPattern
可以查看此路径模式所匹配的节点的下一层的所有节点。
示例:
- 查询 root 的下一层:show child nodes root
1. +------------+
2. | child nodes|
3. +------------+
4. | ln|
5. +------------+
- 查询 root.ln 的下一层 :show child nodes root.ln
1. +------------+
2. | child nodes|
3. +------------+
4. | wf01|
5. | wf02|
6. +------------+
统计节点数
IoTDB 支持使用COUNT NODES <PathPattern> LEVEL=<INTEGER>来统计当前 Metadata
树下满足某路径模式的路径中指定层级的节点个数。这条语句可以用来统计带有特定采样点的设备数。例如:
1. IoTDB > COUNT NODES root.** LEVEL=2
2. IoTDB > COUNT NODES root.ln.** LEVEL=2
3. IoTDB > COUNT NODES root.ln.wf01.* LEVEL=3
4. IoTDB > COUNT NODES root.**.temperature LEVEL=3
对于上面提到的例子和 Metadata Tree,你可以获得如下结果:
1. +------------+
2. |count(nodes)|
3. +------------+
4. | 4|
5. +------------+
6. Total line number = 1
7. It costs 0.003s
9. +------------+
10. |count(nodes)|
11. +------------+
12. | 2|
13. +------------+
14. Total line number = 1
15. It costs 0.002s
17. +------------+
18. |count(nodes)|
19. +------------+
20. | 1|
21. +------------+
22. Total line number = 1
23. It costs 0.002s
25. +------------+
26. |count(nodes)|
27. +------------+
28. | 2|
29. +------------+
30. Total line number = 1
31. It costs 0.002s
注意:时间序列的路径只是过滤条件,与 level 的定义无关。
查看设备
- SHOW DEVICES pathPattern? (WITH DATABASE)? devicesWhereClause? limitClause?
与 Show Timeseries 相似,IoTDB 目前也支持两种方式查看设备。
SHOW DEVICES语句显示当前所有的设备信息,等价于SHOW DEVICES root.**。SHOW DEVICES <PathPattern>语句规定了PathPattern,返回给定的路径模式所匹配的设备信息。WHERE条件中可以使用DEVICE contains 'xxx',根据 device 名称进行模糊查询。WHERE条件中可以使用TEMPLATE = 'xxx',TEMPLATE != 'xxx',根据 template 名称进行过滤查询。WHERE条件中可以使用TEMPLATE is null,TEMPLATE is not null,根据 template 是否为null(null 表示没激活)进行过滤查询。
SQL 语句如下所示:
1. IoTDB> show devices
2. IoTDB> show devices root.ln.**
3. IoTDB> show devices root.ln.** where device contains 't'
4. IoTDB> show devices root.ln.** where template = 't1'
5. IoTDB> show devices root.ln.** where template is null
6. IoTDB> show devices root.ln.** where template != 't1'
7. IoTDB> show devices root.ln.** where template is not null
你可以获得如下数据:
1. +-------------------+---------+---------+
2. | devices|isAligned| Template|
3. +-------------------+---------+---------+
4. | root.ln.wf01.wt01| false| t1|
5. | root.ln.wf02.wt02| false| null|
6. |root.sgcc.wf03.wt01| false| null|
7. | root.turbine.d1| false| null|
8. +-------------------+---------+---------+
9. Total line number = 4
10. It costs 0.002s
12. +-----------------+---------+---------+
13. | devices|isAligned| Template|
14. +-----------------+---------+---------+
15. |root.ln.wf01.wt01| false| t1|
16. |root.ln.wf02.wt02| false| null|
17. +-----------------+---------+---------+
18. Total line number = 2
19. It costs 0.001s
21. +-----------------+---------+---------+
22. | devices|isAligned| Template|
23. +-----------------+---------+---------+
24. |root.ln.wf01.wt01| false| t1|
25. |root.ln.wf02.wt02| false| null|
26. +-----------------+---------+---------+
27. Total line number = 2
28. It costs 0.001s
30. +-----------------+---------+---------+
31. | devices|isAligned| Template|
32. +-----------------+---------+---------+
33. |root.ln.wf01.wt01| false| t1|
34. +-----------------+---------+---------+
35. Total line number = 1
36. It costs 0.001s
38. +-----------------+---------+---------+
39. | devices|isAligned| Template|
40. +-----------------+---------+---------+
41. |root.ln.wf02.wt02| false| null|
42. +-----------------+---------+---------+
43. Total line number = 1
44. It costs 0.001s
其中,isAligned表示该设备下的时间序列是否对齐,
Template显示着该设备所激活的模板名,null 表示没有激活模板。
查看设备及其 database 信息,可以使用 SHOW DEVICES WITH DATABASE 语句。
SHOW DEVICES WITH DATABASE语句显示当前所有的设备信息和其所在的 database,等价于SHOW DEVICES root.**。SHOW DEVICES <PathPattern> WITH DATABASE语句规定了PathPattern,返回给定的路径模式所匹配的设备信息和其所在的 database。
SQL 语句如下所示:
1. IoTDB> show devices with database
2. IoTDB> show devices root.ln.** with database
你可以获得如下数据:
1. +-------------------+-------------+---------+---------+
2. | devices| database|isAligned| Template|
3. +-------------------+-------------+---------+---------+
4. | root.ln.wf01.wt01| root.ln| false| t1|
5. | root.ln.wf02.wt02| root.ln| false| null|
6. |root.sgcc.wf03.wt01| root.sgcc| false| null|
7. | root.turbine.d1| root.turbine| false| null|
8. +-------------------+-------------+---------+---------+
9. Total line number = 4
10. It costs 0.003s
12. +-----------------+-------------+---------+---------+
13. | devices| database|isAligned| Template|
14. +-----------------+-------------+---------+---------+
15. |root.ln.wf01.wt01| root.ln| false| t1|
16. |root.ln.wf02.wt02| root.ln| false| null|
17. +-----------------+-------------+---------+---------+
18. Total line number = 2
19. It costs 0.001s
统计设备数量
- COUNT DEVICES <PathPattern>
上述语句用于统计设备的数量,同时允许指定PathPattern 用于统计匹配该PathPattern 的设备数量
SQL 语句如下所示:
1. IoTDB> show devices
2. IoTDB> count devices
3. IoTDB> count devices root.ln.**
你可以获得如下数据:
1. +-------------------+---------+---------+
2. | devices|isAligned| Template|
3. +-------------------+---------+---------+
4. |root.sgcc.wf03.wt03| false| null|
5. | root.turbine.d1| false| null|
6. | root.ln.wf02.wt02| false| null|
7. | root.ln.wf01.wt01| false| t1|
8. +-------------------+---------+---------+
9. Total line number = 4
10. It costs 0.024s
12. +--------------+
13. |count(devices)|
14. +--------------+
15. | 4|
16. +--------------+
17. Total line number = 1
18. It costs 0.004s
20. +--------------+
21. |count(devices)|
22. +--------------+
23. | 2|
24. +--------------+
25. Total line number = 1
26. It costs 0.004s
