測點管理
測點管理
1. 數據庫管理
數據庫(Database)可以被視為關系數據庫中的Database。
1.1 創建數據庫
我們可以根據存儲模型建立相應的數據庫。如下所示:
CREATE DATABASE root.ln;需要注意的是,推薦創建一個 database.
Database 的父子節點都不能再設置 database。例如在已經有root.ln和root.sgcc這兩個 database 的情況下,創建root.ln.wf01 database 是不可行的。系統將給出相應的錯誤提示,如下所示:
CREATE DATABASE root.ln.wf01;
Msg: 300: root.ln has already been created as database.Database 節點名命名規則:
- 節點名可由中英文字符、數字、下劃線(_)、英文句號(.)、反引號(`) 組成
- 若節點名為以下情況,則必須用反引號(`) 將整個名稱包裹。
- 純數字(如 12345)
- 含有特殊字符(如 . 或 _)并可能引發歧義的名稱(如 db.01、_temp)
- 反引號的特殊處理:
若節點名本身需要包含反引號(`),則需用兩個反引號(``) 表示一個反引號。例如:命名為`db123``(本身包含一個反引號),需寫為 `db123```。
還需注意,如果在 Windows 系統上部署,database 名是大小寫不敏感的。例如同時創建root.ln 和 root.LN 是不被允許的。
1.2 查看數據庫
在 database 創建后,我們可以使用 SHOW DATABASES 語句和 SHOW DATABASES <PathPattern> 來查看 database,SQL 語句如下所示:
show databases;
show databases root.*;
show databases root.**;執行結果為:
+-------------+----+-------------------------+-----------------------+-----------------------+
| database| ttl|schema_replication_factor|data_replication_factor|time_partition_interval|
+-------------+----+-------------------------+-----------------------+-----------------------+
| root.sgcc|null| 2| 2| 604800|
| root.ln|null| 2| 2| 604800|
+-------------+----+-------------------------+-----------------------+-----------------------+
Total line number = 2
It costs 0.060s1.3 刪除數據庫
用戶可以使用DELETE DATABASE <PathPattern>語句刪除該路徑模式匹配的所有的數據庫。在刪除的過程中,需要注意的是數據庫的數據也會被刪除。
DELETE DATABASE root.ln;
DELETE DATABASE root.sgcc;
// 刪除所有數據,時間序列以及數據庫;
DELETE DATABASE root.**;1.4 統計數據庫數量
用戶可以使用COUNT DATABASES <PathPattern>語句統計數據庫的數量,允許指定PathPattern 用來統計匹配該PathPattern 的數據庫的數量
SQL 語句如下所示:
show databases;
count databases;
count databases root.*;
count databases root.sgcc.*;
count databases root.sgcc;執行結果為:
+-------------+
| database|
+-------------+
| root.sgcc|
| root.turbine|
| root.ln|
+-------------+
Total line number = 3
It costs 0.003s
+-------------+
| Database|
+-------------+
| 3|
+-------------+
Total line number = 1
It costs 0.003s
+-------------+
| Database|
+-------------+
| 3|
+-------------+
Total line number = 1
It costs 0.002s
+-------------+
| Database|
+-------------+
| 0|
+-------------+
Total line number = 1
It costs 0.002s
+-------------+
| database|
+-------------+
| 1|
+-------------+
Total line number = 1
It costs 0.002s1.5 數據保留時間(TTL)
IoTDB 支持對 device 級別設置數據保留時間(TTL),這使得 IoTDB 可以定期、自動地刪除一定時間之前的數據。合理使用 TTL可以幫助您控制 IoTDB 占用的總磁盤空間以避免出現磁盤寫滿等異常。并且,隨著文件數量的增多,查詢性能往往隨之下降,內存占用也會有所提高。及時地刪除一些較老的文件有助于使查詢性能維持在一個較高的水平和減少內存資源的占用。
TTL的默認單位為毫秒,如果配置文件中的時間精度修改為其他單位,設置ttl時仍然使用毫秒單位。
當設置 TTL 時,系統會根據設置的路徑尋找所包含的所有 device,并為這些 device 設置 TTL 時間,系統會按設備粒度對過期數據進行刪除。請注意,此處是否過期判斷依據的是數據點時間,不是寫入時間。
當設備數據過期后,將不能被查詢到,但磁盤文件中的數據不能保證立即刪除(會在一定時間內刪除),但可以保證最終被刪除。
考慮到操作代價,系統不會立即物理刪除超過 TTL 的數據,而是通過合并來延遲地物理刪除。因此,在數據被物理刪除前,如果調小或者解除 TTL,可能會導致之前因 TTL 而不可見的數據重新出現。
系統中僅能設置至多 1000 條 TTL 規則,達到該上限時,需要先刪除部分 TTL 規則才能設置新的規則
TTL Path 規則
設置的路徑 path 只支持前綴路徑(即路徑中間不能帶 * , 且必須以 ** 結尾),該路徑會匹配到設備,也允許用戶指定不帶星的 path 為具體的 database 或 device,當 path 不帶 * 時,會檢查是否匹配到 database,若匹配到 database,則會同時設置 path 和 path.**。
注意:設備 TTL 設置不會對元數據的存在性進行校驗,即允許對一條不存在的設備設置 TTL。
合格的 path:
root.**
root.db.**
root.db.group1.**
root.db
root.db.group1.d1
不合格的 path:
root.*.db
root.**.db.*
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 語句如下所示:
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 語句如下所示:
unset ttl from root.ln;取消設置 TTL 后, root.ln 路徑下所有的數據都會被保存。
unset ttl from root.sgcc.**;取消設置root.sgcc路徑下的所有的 TTL 。
unset ttl from root.**;取消設置所有的 TTL 。
新語法
unset ttl from root.**;舊語法
unset ttl to root.**;新舊語法在功能上沒有區別并且同時兼容,僅是新語法在用詞上更符合常規。
顯示 TTL
顯示 TTL 的 SQL 語句如下所示:
show all ttl
SHOW ALL TTL;+--------------+--------+
| path| TTL|
| root.**|55555555|
| root.sg2.a.**|44440000|
+--------------+--------+show ttl on pathPattern
SHOW TTL ON root.db.**;+--------------+--------+
| path| TTL|
| root.db.**|55555555|
| root.db.a.**|44440000|
+--------------+--------+SHOW ALL TTL 這個例子會給出所有的 TTL。
SHOW TTL ON pathPattern 這個例子會顯示指定路徑的 TTL。
顯示設備的 TTL。
show devices;+---------------+---------+---------+
| Device|IsAligned| TTL|
+---------------+---------+---------+
|root.sg.device1| false| 36000000|
|root.sg.device2| true| INF|
+---------------+---------+---------+所有設備都一定會有 TTL,即不可能是 null。INF 表示無窮大。
1.6 設置異構數據庫(進階操作)
在熟悉 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-common.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 語句如下所示:
CREATE DATABASE prefixPath (WITH databaseAttributeClause (COMMA? databaseAttributeClause)*)?例如:
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 語句如下所示:
ALTER DATABASE prefixPath WITH databaseAttributeClause (COMMA? databaseAttributeClause)*例如:
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 語句如下所示:
SHOW DATABASES DETAILS prefixPath?例如:
SHOW DATABASES DETAILS;+--------+--------+-----------------------+---------------------+---------------------+--------------------+-----------------------+-----------------------+------------------+---------------------+---------------------+
|Database| TTL|SchemaReplicationFactor|DataReplicationFactor|TimePartitionInterval|SchemaRegionGroupNum|MinSchemaRegionGroupNum|MaxSchemaRegionGroupNum|DataRegionGroupNum|MinDataRegionGroupNum|MaxDataRegionGroupNum|
+--------+--------+-----------------------+---------------------+---------------------+--------------------+-----------------------+-----------------------+------------------+---------------------+---------------------+
|root.db1| null| 1| 3| 604800000| 0| 1| 1| 0| 2| 2|
|root.db2|86400000| 1| 1| 604800000| 0| 1| 1| 0| 2| 2|
|root.db3| null| 1| 1| 604800000| 0| 1| 1| 0| 2| 2|
+--------+--------+-----------------------+---------------------+---------------------+--------------------+-----------------------+-----------------------+------------------+---------------------+---------------------+
Total line number = 3
It costs 0.058s各列查詢結果依次為:
- 數據庫名稱
- 數據庫的 TTL
- 數據庫的元數據副本數
- 數據庫的數據副本數
- 數據庫的時間分區間隔
- 數據庫當前擁有的 SchemaRegionGroup 數量
- 數據庫需要擁有的最小 SchemaRegionGroup 數量
- 數據庫允許擁有的最大 SchemaRegionGroup 數量
- 數據庫當前擁有的 DataRegionGroup 數量
- 數據庫需要擁有的最小 DataRegionGroup 數量
- 數據庫允許擁有的最大 DataRegionGroup 數量
2. 時間序列管理
2.1 創建時間序列
根據建立的數據模型,我們可以分別在兩個數據庫中創建相應的時間序列。創建時間序列的 SQL 語句如下所示:
create timeseries root.ln.wf01.wt01.status with datatype=BOOLEAN;
create timeseries root.ln.wf01.wt01.temperature with datatype=FLOAT;
create timeseries root.ln.wf02.wt02.hardware with datatype=TEXT;
create timeseries root.ln.wf02.wt02.status with datatype=BOOLEAN;
create timeseries root.sgcc.wf03.wt01.status with datatype=BOOLEAN;
create timeseries root.sgcc.wf03.wt01.temperature with datatype=FLOAT;從 v0.13 起,可以使用簡化版的 SQL 語句創建時間序列:
create timeseries root.ln.wf01.wt01.status BOOLEAN;
create timeseries root.ln.wf01.wt01.temperature FLOAT;
create timeseries root.ln.wf02.wt02.hardware TEXT;
create timeseries root.ln.wf02.wt02.status BOOLEAN;
create timeseries root.sgcc.wf03.wt01.status BOOLEAN;
create timeseries root.sgcc.wf03.wt01.temperature FLOAT;創建時間序列時,系統會默認指定編碼壓縮方式,無需手動指定,若業務場景需要手動調整,可參考如下示例:
create timeseries root.sgcc.wf03.wt01.temperature FLOAT encoding=PLAIN compressor=SNAPPY;需要注意的是,如果手動指定了編碼方式,但與數據類型不對應時,系統會給出相應的錯誤提示,如下所示:
create timeseries root.ln.wf02.wt02.status WITH DATATYPE=BOOLEAN, ENCODING=TS_2DIFF;
error: encoding TS_2DIFF does not support BOOLEAN更多詳細的數據類型與編碼壓縮方式的對應列表請參見 壓縮&編碼。
2.2 創建對齊時間序列
創建一組對齊時間序列的SQL語句如下所示:
CREATE ALIGNED TIMESERIES root.ln.wf01.GPS(latitude FLOAT, longitude FLOAT);一組對齊序列中的序列可以有不同的數據類型、編碼方式以及壓縮方式。
對齊的時間序列也支持設置別名、標簽、屬性。
2.3 刪除時間序列
我們可以使用(DELETE | DROP) TimeSeries <PathPattern>語句來刪除我們之前創建的時間序列。SQL 語句如下所示:
delete timeseries root.ln.wf01.wt01.status;
delete timeseries root.ln.wf01.wt01.temperature, root.ln.wf02.wt02.hardware;
delete timeseries root.ln.wf02.*;
drop timeseries root.ln.wf02.*;2.4 查看時間序列
SHOW LATEST? TIMESERIES pathPattern? timeseriesWhereClause? limitClause?
SHOW TIMESERIES 中可以有四種可選的子句,查詢結果為這些時間序列的所有信息
時間序列信息具體包括:時間序列路徑名,database,Measurement 別名,數據類型,編碼方式,壓縮方式,屬性和標簽。
示例:
SHOW TIMESERIES
展示系統中所有的時間序列信息
SHOW TIMESERIES <
Path>返回給定路徑的下的所有時間序列信息。其中
Path需要為一個時間序列路徑或路徑模式。例如,分別查看root路徑和root.ln路徑下的時間序列,SQL 語句如下所示:
show timeseries root.**;
show timeseries root.ln.**;執行結果分別為:
+-------------------------------+--------+-------------+--------+--------+-----------+-------------------------------------------+--------------------------------------------------------+--------+-------------------+
| timeseries| alias| database|dataType|encoding|compression| tags| attributes|deadband|deadband parameters|
+-------------------------------+--------+-------------+--------+--------+-----------+-------------------------------------------+--------------------------------------------------------+--------+-------------------+
|root.sgcc.wf03.wt01.temperature| null| root.sgcc| FLOAT| RLE| SNAPPY| null| null| null| null|
| root.sgcc.wf03.wt01.status| null| root.sgcc| BOOLEAN| PLAIN| SNAPPY| null| null| null| null|
| 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|
| root.ln.wf02.wt02.hardware| null| root.ln| TEXT| PLAIN| SNAPPY| null| null| null| null|
| root.ln.wf02.wt02.status| null| root.ln| BOOLEAN| PLAIN| SNAPPY| null| null| null| null|
| root.ln.wf01.wt01.temperature| null| root.ln| FLOAT| RLE| SNAPPY| null| null| null| null|
| root.ln.wf01.wt01.status| null| root.ln| BOOLEAN| PLAIN| SNAPPY| null| null| null| null|
+-------------------------------+--------+-------------+--------+--------+-----------+-------------------------------------------+--------------------------------------------------------+--------+-------------------+
Total line number = 7
It costs 0.016s
+-----------------------------+-----+-------------+--------+--------+-----------+----+----------+--------+-------------------+
| timeseries|alias| database|dataType|encoding|compression|tags|attributes|deadband|deadband parameters|
+-----------------------------+-----+-------------+--------+--------+-----------+----+----------+--------+-------------------+
| root.ln.wf02.wt02.hardware| null| root.ln| TEXT| PLAIN| SNAPPY|null| null| null| null|
| root.ln.wf02.wt02.status| null| root.ln| BOOLEAN| PLAIN| SNAPPY|null| null| null| null|
|root.ln.wf01.wt01.temperature| null| root.ln| FLOAT| RLE| SNAPPY|null| null| null| null|
| root.ln.wf01.wt01.status| null| root.ln| BOOLEAN| PLAIN| SNAPPY|null| null| null| null|
+-----------------------------+-----+-------------+--------+--------+-----------+----+----------+--------+-------------------+
Total line number = 4
It costs 0.004sSHOW TIMESERIES LIMIT INT OFFSET INT
只返回從指定下標開始的結果,最大返回條數被 LIMIT 限制,用于分頁查詢。例如:
show timeseries root.ln.** limit 10 offset 10;SHOW TIMESERIES WHERE TIMESERIES contains 'containStr'
對查詢結果集根據 timeseries 名稱進行字符串模糊匹配過濾。例如:
show timeseries root.ln.** where timeseries contains 'wf01.wt';執行結果為:
+-------------------------------+--------+-------------+--------+--------+-----------+-------------------------------------------+--------------------------------------------------------+--------+-------------------+
| timeseries| alias| database|dataType|encoding|compression| tags| attributes|deadband|deadband parameters|
+-------------------------------+--------+-------------+--------+--------+-----------+-------------------------------------------+--------------------------------------------------------+--------+-------------------+
| root.ln.wf01.wt01.temperature| null| root.ln| FLOAT| RLE| SNAPPY| null| null| null| null|
| root.ln.wf01.wt01.status| null| root.ln| BOOLEAN| PLAIN| SNAPPY| null| null| null| null|
+-------------------------------+--------+-------------+--------+--------+-----------+-------------------------------------------+--------------------------------------------------------+--------+-------------------+
Total line number = 2
It costs 0.016sSHOW TIMESERIES WHERE DataType=type
對查詢結果集根據時間序列數據類型進行過濾。例如:
show timeseries root.ln.** where dataType=FLOAT;執行結果為:
+-------------------------------+--------+-------------+--------+--------+-----------+-------------------------------------------+--------------------------------------------------------+--------+-------------------+
| timeseries| alias| database|dataType|encoding|compression| tags| attributes|deadband|deadband parameters|
+-------------------------------+--------+-------------+--------+--------+-----------+-------------------------------------------+--------------------------------------------------------+--------+-------------------+
|root.sgcc.wf03.wt01.temperature| null| root.sgcc| FLOAT| RLE| SNAPPY| null| null| null| null|
| 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|
| root.ln.wf01.wt01.temperature| null| root.ln| FLOAT| RLE| SNAPPY| null| null| null| null|
+-------------------------------+--------+-------------+--------+--------+-----------+-------------------------------------------+--------------------------------------------------------+--------+-------------------+
Total line number = 3
It costs 0.016sSHOW TIMESERIES WHERE TAGS(KEY) = VALUE
SHOW TIMESERIES WHERE TAGS(KEY) CONTAINS VALUE
對查詢結果集根據標簽進行過濾。例如:
show timeseries root.ln.** where TAGS(unit)='c';
show timeseries root.ln.** where TAGS(description) contains 'test1';執行結果分別為:
+--------------------------+-----+-------------+--------+--------+-----------+------------+----------+--------+-------------------+
| timeseries|alias| database|dataType|encoding|compression| tags|attributes|deadband|deadband parameters|
+--------------------------+-----+-------------+--------+--------+-----------+------------+----------+--------+-------------------+
|root.ln.wf02.wt02.hardware| null| root.ln| TEXT| PLAIN| SNAPPY|{"unit":"c"}| null| null| null|
+--------------------------+-----+-------------+--------+--------+-----------+------------+----------+--------+-------------------+
Total line number = 1
It costs 0.005s
+------------------------+-----+-------------+--------+--------+-----------+-----------------------+----------+--------+-------------------+
| timeseries|alias| database|dataType|encoding|compression| tags|attributes|deadband|deadband parameters|
+------------------------+-----+-------------+--------+--------+-----------+-----------------------+----------+--------+-------------------+
|root.ln.wf02.wt02.status| null| root.ln| BOOLEAN| PLAIN| SNAPPY|{"description":"test1"}| null| null| null|
+------------------------+-----+-------------+--------+--------+-----------+-----------------------+----------+--------+-------------------+
Total line number = 1
It costs 0.004sSHOW LATEST TIMESERIES
表示查詢出的時間序列需要按照最近插入時間戳降序排列
需要注意的是,當查詢路徑不存在時,系統會返回 0 條時間序列。
2.5 統計時間序列總數
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>。
COUNT TIMESERIES root.**;
COUNT TIMESERIES root.ln.**;
COUNT TIMESERIES root.ln.*.*.status;
COUNT TIMESERIES root.ln.wf01.wt01.status;
COUNT TIMESERIES root.** WHERE TIMESERIES contains 'sgcc' ;
COUNT TIMESERIES root.** WHERE DATATYPE = INT64;
COUNT TIMESERIES root.** WHERE TAGS(unit) contains 'c' ;
COUNT TIMESERIES root.** WHERE TAGS(unit) = 'c' ;
COUNT TIMESERIES root.** WHERE TIMESERIES contains 'sgcc' group by level = 1;例如有如下時間序列(可以使用show timeseries展示所有時間序列):
+-------------------------------+--------+-------------+--------+--------+-----------+-------------------------------------------+--------------------------------------------------------+--------+-------------------+
| timeseries| alias| database|dataType|encoding|compression| tags| attributes|deadband|deadband parameters|
+-------------------------------+--------+-------------+--------+--------+-----------+-------------------------------------------+--------------------------------------------------------+--------+-------------------+
|root.sgcc.wf03.wt01.temperature| null| root.sgcc| FLOAT| RLE| SNAPPY| null| null| null| null|
| root.sgcc.wf03.wt01.status| null| root.sgcc| BOOLEAN| PLAIN| SNAPPY| null| null| null| null|
| 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|
| root.ln.wf02.wt02.hardware| null| root.ln| TEXT| PLAIN| SNAPPY| {"unit":"c"}| null| null| null|
| root.ln.wf02.wt02.status| null| root.ln| BOOLEAN| PLAIN| SNAPPY| {"description":"test1"}| null| null| null|
| root.ln.wf01.wt01.temperature| null| root.ln| FLOAT| RLE| SNAPPY| null| null| null| null|
| root.ln.wf01.wt01.status| null| root.ln| BOOLEAN| PLAIN| SNAPPY| null| null| null| null|
+-------------------------------+--------+-------------+--------+--------+-----------+-------------------------------------------+--------------------------------------------------------+--------+-------------------+
Total line number = 7
It costs 0.004s那么 Metadata Tree 如下所示:

可以看到,root被定義為LEVEL=0。那么當你輸入如下語句時:
COUNT TIMESERIES root.** GROUP BY LEVEL=1;
COUNT TIMESERIES root.ln.** GROUP BY LEVEL=2;
COUNT TIMESERIES root.ln.wf01.* GROUP BY LEVEL=2;你將得到以下結果:
COUNT TIMESERIES root.** GROUP BY LEVEL=1;
COUNT TIMESERIES root.ln.** GROUP BY LEVEL=2;
COUNT TIMESERIES root.ln.wf01.* GROUP BY LEVEL=2;+------------+-----------------+
| column|count(timeseries)|
+------------+-----------------+
| root.sgcc| 2|
|root.turbine| 1|
| root.ln| 4|
+------------+-----------------+
Total line number = 3
It costs 0.002s
+------------+-----------------+
| column|count(timeseries)|
+------------+-----------------+
|root.ln.wf02| 2|
|root.ln.wf01| 2|
+------------+-----------------+
Total line number = 2
It costs 0.002s
+------------+-----------------+
| column|count(timeseries)|
+------------+-----------------+
|root.ln.wf01| 2|
+------------+-----------------+
Total line number = 1
It costs 0.002s注意:時間序列的路徑只是過濾條件,與 level 的定義無關。
2.6 活躍時間序列查詢
我們在原有的時間序列查詢和統計上添加新的WHERE時間過濾條件,可以得到在指定時間范圍中存在數據的時間序列。
需要注意的是, 在帶有時間過濾的元數據查詢中并不考慮視圖的存在,只考慮TsFile中實際存儲的時間序列。
一個使用樣例如下:
insert into root.sg.data(timestamp, s1,s2) values(15000, 1, 2);
insert into root.sg.data2(timestamp, s1,s2) values(15002, 1, 2);
insert into root.sg.data3(timestamp, s1,s2) values(16000, 1, 2);
show timeseries;
show timeseries where time >= 15000 and time < 16000;
count timeseries where time >= 15000 and time < 16000;+----------------+-----+--------+--------+--------+-----------+----+----------+--------+------------------+--------+
| Timeseries|Alias|Database|DataType|Encoding|Compression|Tags|Attributes|Deadband|DeadbandParameters|ViewType|
+----------------+-----+--------+--------+--------+-----------+----+----------+--------+------------------+--------+
| root.sg.data.s1| null| root.sg| FLOAT| GORILLA| LZ4|null| null| null| null| BASE|
| root.sg.data.s2| null| root.sg| FLOAT| GORILLA| LZ4|null| null| null| null| BASE|
|root.sg.data3.s1| null| root.sg| FLOAT| GORILLA| LZ4|null| null| null| null| BASE|
|root.sg.data3.s2| null| root.sg| FLOAT| GORILLA| LZ4|null| null| null| null| BASE|
|root.sg.data2.s1| null| root.sg| FLOAT| GORILLA| LZ4|null| null| null| null| BASE|
|root.sg.data2.s2| null| root.sg| FLOAT| GORILLA| LZ4|null| null| null| null| BASE|
+----------------+-----+--------+--------+--------+-----------+----+----------+--------+------------------+--------+
+----------------+-----+--------+--------+--------+-----------+----+----------+--------+------------------+--------+
| Timeseries|Alias|Database|DataType|Encoding|Compression|Tags|Attributes|Deadband|DeadbandParameters|ViewType|
+----------------+-----+--------+--------+--------+-----------+----+----------+--------+------------------+--------+
| root.sg.data.s1| null| root.sg| FLOAT| GORILLA| LZ4|null| null| null| null| BASE|
| root.sg.data.s2| null| root.sg| FLOAT| GORILLA| LZ4|null| null| null| null| BASE|
|root.sg.data2.s1| null| root.sg| FLOAT| GORILLA| LZ4|null| null| null| null| BASE|
|root.sg.data2.s2| null| root.sg| FLOAT| GORILLA| LZ4|null| null| null| null| BASE|
+----------------+-----+--------+--------+--------+-----------+----+----------+--------+------------------+--------+
+-----------------+
|count(timeseries)|
+-----------------+
| 4|
+-----------------+關于活躍時間序列的定義,能通過正常查詢查出來的數據就是活躍數據,也就是說插入但被刪除的時間序列不在考慮范圍內。
2.7 標簽點管理
我們可以在創建時間序列的時候,為它添加別名和額外的標簽和屬性信息。
標簽和屬性的區別在于:
- 標簽可以用來查詢時間序列路徑,會在內存中維護標點到時間序列路徑的倒排索引:標簽 -> 時間序列路徑
- 屬性只能用時間序列路徑來查詢:時間序列路徑 -> 屬性
所用到的擴展的創建時間序列的 SQL 語句如下所示:
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.
- 標簽點屬性更新
創建時間序列后,我們也可以對其原有的標簽點屬性進行更新,主要有以下六種更新方式: - 重命名標簽或屬性
ALTER timeseries root.turbine.d1.s1 RENAME tag1 TO newTag1;- 重新設置標簽或屬性的值
ALTER timeseries root.turbine.d1.s1 SET newTag1=newV1, attr1=newV1;- 刪除已經存在的標簽或屬性
ALTER timeseries root.turbine.d1.s1 DROP tag1, tag2;- 添加新的標簽
ALTER timeseries root.turbine.d1.s1 ADD TAGS tag3=v3, tag4=v4;- 添加新的屬性
ALTER timeseries root.turbine.d1.s1 ADD ATTRIBUTES attr3=v3, attr4=v4;- 更新插入別名,標簽和屬性
如果該別名,標簽或屬性原來不存在,則插入,否則,用新值更新原來的舊值
ALTER timeseries root.turbine.d1.s1 UPSERT ALIAS=newAlias TAGS(tag2=newV2, tag3=v3) ATTRIBUTES(attr3=v3, attr4=v4);- 使用標簽作為過濾條件查詢時間序列,使用 TAGS(tagKey) 來標識作為過濾條件的標簽
SHOW TIMESERIES (<`PathPattern`>)? timeseriesWhereClause返回給定路徑的下的所有滿足條件的時間序列信息,SQL 語句如下所示:
ALTER timeseries root.ln.wf02.wt02.hardware ADD TAGS unit=c;
ALTER timeseries root.ln.wf02.wt02.status ADD TAGS description=test1;
show timeseries root.ln.** where TAGS(unit)='c';
show timeseries root.ln.** where TAGS(description) contains 'test1';執行結果分別為:
+--------------------------+-----+-------------+--------+--------+-----------+------------+----------+--------+-------------------+
| timeseries|alias| database|dataType|encoding|compression| tags|attributes|deadband|deadband parameters|
+--------------------------+-----+-------------+--------+--------+-----------+------------+----------+--------+-------------------+
|root.ln.wf02.wt02.hardware| null| root.ln| TEXT| PLAIN| SNAPPY|{"unit":"c"}| null| null| null|
+--------------------------+-----+-------------+--------+--------+-----------+------------+----------+--------+-------------------+
Total line number = 1
It costs 0.005s
+------------------------+-----+-------------+--------+--------+-----------+-----------------------+----------+--------+-------------------+
| timeseries|alias| database|dataType|encoding|compression| tags|attributes|deadband|deadband parameters|
+------------------------+-----+-------------+--------+--------+-----------+-----------------------+----------+--------+-------------------+
|root.ln.wf02.wt02.status| null| root.ln| BOOLEAN| PLAIN| SNAPPY|{"description":"test1"}| null| null| null|
+------------------------+-----+-------------+--------+--------+-----------+-----------------------+----------+--------+-------------------+
Total line number = 1
It costs 0.004s- 使用標簽作為過濾條件統計時間序列數量
COUNT TIMESERIES (<`PathPattern`>)? timeseriesWhereClause;
COUNT TIMESERIES (<`PathPattern`>)? timeseriesWhereClause GROUP BY LEVEL=<INTEGER>;返回給定路徑的下的所有滿足條件的時間序列的數量,SQL 語句如下所示:
count timeseries;
count timeseries root.** where TAGS(unit)='c';
count timeseries root.** where TAGS(unit)='c' group by level = 2;執行結果分別為:
+-----------------+
|count(timeseries)|
+-----------------+
| 6|
+-----------------+
Total line number = 1
It costs 0.019s
+-----------------+
|count(timeseries)|
+-----------------+
| 2|
+-----------------+
Total line number = 1
It costs 0.020s
+--------------+-----------------+
| column|count(timeseries)|
+--------------+-----------------+
| root.ln.wf02| 2|
| root.ln.wf01| 0|
|root.sgcc.wf03| 0|
+--------------+-----------------+
Total line number = 3
It costs 0.011s注意,現在我們只支持一個查詢條件,要么是等值條件查詢,要么是包含條件查詢。當然 where 子句中涉及的必須是標簽值,而不能是屬性值。
創建對齊時間序列
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));執行結果如下:
show timeseries;+--------------+-----+-------------+--------+--------+-----------+-------------------------+---------------------------+--------+-------------------+
| timeseries|alias| database|dataType|encoding|compression| tags| attributes|deadband|deadband parameters|
+--------------+-----+-------------+--------+--------+-----------+-------------------------+---------------------------+--------+-------------------+
|root.sg1.d1.s1| null| root.sg1| INT32| RLE| SNAPPY|{"tag1":"v1","tag2":"v2"}|{"attr2":"v2","attr1":"v1"}| null| null|
|root.sg1.d1.s2| null| root.sg1| DOUBLE| GORILLA| SNAPPY|{"tag4":"v4","tag3":"v3"}|{"attr4":"v4","attr3":"v3"}| null| null|
+--------------+-----+-------------+--------+--------+-----------+-------------------------+---------------------------+--------+-------------------+支持查詢:
show timeseries where TAGS(tag1)='v1';+--------------+-----+-------------+--------+--------+-----------+-------------------------+---------------------------+--------+-------------------+
| timeseries|alias| database|dataType|encoding|compression| tags| attributes|deadband|deadband parameters|
+--------------+-----+-------------+--------+--------+-----------+-------------------------+---------------------------+--------+-------------------+
|root.sg1.d1.s1| null| root.sg1| INT32| RLE| SNAPPY|{"tag1":"v1","tag2":"v2"}|{"attr2":"v2","attr1":"v1"}| null| null|
+--------------+-----+-------------+--------+--------+-----------+-------------------------+---------------------------+--------+-------------------+上述對時間序列標簽、屬性的更新等操作都支持。
3. 路徑查詢
3.1 路徑(Path)
路徑(path)是用于表示時間序列的層級結構的表達式,其語法定義如下:
path
: nodeName ('.' nodeName)*
;
nodeName
: wildcard? identifier wildcard?
| wildcard
;
wildcard
: '*'
| '**'
;3.2 路徑結點名(NodeName)
- 路徑中由
.分割的部分稱為路徑結點名(nodeName)。 - 例如,
root.a.b.c是一個層級為 4 的路徑,其中 root、a、b 和 c 都是路徑結點名。
約束條件
保留字符 root:root 是一個保留字符,僅允許出現在路徑的開頭。如果在其他層級出現 root,系統將無法解析并提示報錯。
字符支持:除 root 外的其他層級支持以下字符:
- 字母(a-z、A-Z)
- 數字(0-9)
- 下劃線(_)
- UNICODE 中文字符(\u2E80 到 \u9FFF)
大小寫敏感性:在 Windows 系統上,數據庫路徑結點名是大小寫不敏感的。例如,root.ln 和 root.LN 會被視為相同的路徑。
3.3 特殊字符(反引號)
如果路徑結點名(NodeName)中需要使用特殊字符(如空格、標點符號等),可以使用反引號(`)將結點名引用起來。更多關于反引號的使用方法,請參考反引號。
3.4 路徑模式(Path Pattern)
為了使得在表達多個時間序列的時候更加方便快捷,IoTDB 為用戶提供帶通配符*或**的路徑。通配符可以出現在路徑中的任何層。
單層通配符(*):在路徑中表示一層。
- 例如,
root.vehicle.*.sensor1表示以root.vehicle為前綴,以sensor1為后綴,且層級等于 4 的路徑。
- 例如,
多層通配符(**):在路徑中表示(
*)+,即為一層或多層*.- 例如:
root.vehicle.device1.**表示所有以root.vehicle.device1為前綴且層級大于等于 4 的路徑。 root.vehicle.**.sensor1表示以root.vehicle為前綴,以sensor1為后綴,且層級大于等于 4 的路徑。
- 例如:
注意:* 和 ** 不能放在路徑的開頭。
3.5 查看路徑的所有子路徑
SHOW CHILD PATHS pathPattern;可以查看此路徑模式所匹配的所有路徑的下一層的所有路徑和它對應的節點類型,即pathPattern.*所匹配的路徑及其節點類型。
節點類型:ROOT -> SG INTERNAL -> DATABASE -> INTERNAL -> DEVICE -> TIMESERIES
示例:
- 查詢 root.ln 的下一層:show child paths root.ln
+------------+----------+
| child paths|node types|
+------------+----------+
|root.ln.wf01| INTERNAL|
|root.ln.wf02| INTERNAL|
+------------+----------+
Total line number = 2
It costs 0.002s- 查詢形如 root.xx.xx.xx 的路徑:show child paths root.*.*
+---------------+
| child paths|
+---------------+
|root.ln.wf01.s1|
|root.ln.wf02.s2|
+---------------+3.6 查看路徑的下一級節點
SHOW CHILD NODES pathPattern;可以查看此路徑模式所匹配的節點的下一層的所有節點。
示例:
- 查詢 root 的下一層:show child nodes root
+------------+
| child nodes|
+------------+
| ln|
+------------+- 查詢 root.ln 的下一層 :show child nodes root.ln
+------------+
| child nodes|
+------------+
| wf01|
| wf02|
+------------+3.7 統計節點數
IoTDB 支持使用COUNT NODES <PathPattern> LEVEL=<INTEGER>來統計當前 Metadata
樹下滿足某路徑模式的路徑中指定層級的節點個數。這條語句可以用來統計帶有特定采樣點的設備數。例如:
COUNT NODES root.** LEVEL=2;
COUNT NODES root.ln.** LEVEL=2;
COUNT NODES root.ln.wf01.* LEVEL=3;
COUNT NODES root.**.temperature LEVEL=3;對于上面提到的例子和 Metadata Tree,你可以獲得如下結果:
+------------+
|count(nodes)|
+------------+
| 4|
+------------+
Total line number = 1
It costs 0.003s
+------------+
|count(nodes)|
+------------+
| 2|
+------------+
Total line number = 1
It costs 0.002s
+------------+
|count(nodes)|
+------------+
| 1|
+------------+
Total line number = 1
It costs 0.002s
+------------+
|count(nodes)|
+------------+
| 2|
+------------+
Total line number = 1
It costs 0.002s注意:時間序列的路徑只是過濾條件,與 level 的定義無關。
3.8 查看設備
- SHOW DEVICES pathPattern? (WITH DATABASE)? devicesWhereClause? limitClause?
與 Show Timeseries 相似,IoTDB 目前也支持兩種方式查看設備。
SHOW DEVICES語句顯示當前所有的設備信息,等價于SHOW DEVICES root.**。SHOW DEVICES <PathPattern>語句規定了PathPattern,返回給定的路徑模式所匹配的設備信息。WHERE條件中可以使用DEVICE contains 'xxx',根據 device 名稱進行模糊查詢。
SQL 語句如下所示:
show devices;
show devices root.ln.**;
show devices root.ln.** where device contains 't';你可以獲得如下數據:
+-------------------+---------+---------+
| devices|isAligned| Template|
+-------------------+---------+---------+
| root.ln.wf01.wt01| false| t1|
| root.ln.wf02.wt02| false| null|
|root.sgcc.wf03.wt01| false| null|
| root.turbine.d1| false| null|
+-------------------+---------+---------+
Total line number = 4
It costs 0.002s
+-----------------+---------+---------+
| devices|isAligned| Template|
+-----------------+---------+---------+
|root.ln.wf01.wt01| false| t1|
|root.ln.wf02.wt02| false| null|
+-----------------+---------+---------+
Total line number = 2
It costs 0.001s
+-----------------+---------+---------+
| devices|isAligned| Template|
+-----------------+---------+---------+
|root.ln.wf01.wt01| false| t1|
|root.ln.wf02.wt02| false| null|
+-----------------+---------+---------+
Total line number = 2
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 語句如下所示:
show devices with database;
show devices root.ln.** with database;你可以獲得如下數據:
+-------------------+-------------+---------+---------+
| devices| database|isAligned| Template|
+-------------------+-------------+---------+---------+
| root.ln.wf01.wt01| root.ln| false| t1|
| root.ln.wf02.wt02| root.ln| false| null|
|root.sgcc.wf03.wt01| root.sgcc| false| null|
| root.turbine.d1| root.turbine| false| null|
+-------------------+-------------+---------+---------+
Total line number = 4
It costs 0.003s
+-----------------+-------------+---------+---------+
| devices| database|isAligned| Template|
+-----------------+-------------+---------+---------+
|root.ln.wf01.wt01| root.ln| false| t1|
|root.ln.wf02.wt02| root.ln| false| null|
+-----------------+-------------+---------+---------+
Total line number = 2
It costs 0.001s3.9 統計設備數量
- COUNT DEVICES <PathPattern>
上述語句用于統計設備的數量,同時允許指定PathPattern 用于統計匹配該PathPattern 的設備數量
SQL 語句如下所示:
show devices;
count devices;
count devices root.ln.**;你可以獲得如下數據:
+-------------------+---------+---------+
| devices|isAligned| Template|
+-------------------+---------+---------+
|root.sgcc.wf03.wt03| false| null|
| root.turbine.d1| false| null|
| root.ln.wf02.wt02| false| null|
| root.ln.wf01.wt01| false| t1|
+-------------------+---------+---------+
Total line number = 4
It costs 0.024s
+--------------+
|count(devices)|
+--------------+
| 4|
+--------------+
Total line number = 1
It costs 0.004s
+--------------+
|count(devices)|
+--------------+
| 2|
+--------------+
Total line number = 1
It costs 0.004s3.10 活躍設備查詢
和活躍時間序列一樣,我們可以在查看和統計設備的基礎上添加時間過濾條件來查詢在某段時間內存在數據的活躍設備。這里活躍的定義與活躍時間序列相同,使用樣例如下:
insert into root.sg.data(timestamp, s1,s2) values(15000, 1, 2);
insert into root.sg.data2(timestamp, s1,s2) values(15002, 1, 2);
insert into root.sg.data3(timestamp, s1,s2) values(16000, 1, 2);
show devices;
show devices where time >= 15000 and time < 16000;
count devices where time >= 15000 and time < 16000;+-------------------+---------+
| devices|isAligned|
+-------------------+---------+
| root.sg.data| false|
| root.sg.data2| false|
| root.sg.data3| false|
+-------------------+---------+
+-------------------+---------+
| devices|isAligned|
+-------------------+---------+
| root.sg.data| false|
| root.sg.data2| false|
+-------------------+---------+
+--------------+
|count(devices)|
+--------------+
| 2|
+--------------+