一、概述? ? ? ??
????????數據庫的類型多種多樣,關系型數據庫、時序型數據庫、非關系型數據庫、內存數據庫、分布式數據庫、圖數據庫等等,每種類型都有其特定的使用場景和優勢,KaiwuDB 是一款面向 AIoT 場景的分布式、多模融合、支持原生 AI 的數據庫產品,支持同一實例同時建立時序庫和關系庫并融合處理多模數據,具備時序數據高效處理能力,kwdb支持關系數據庫和時序數據庫之間跨模檢索相關的數據。
什么是時序數據庫?
時序數據庫(Time Series Database, TSDB)是專門針對時間序列數據(按時間順序記錄的數據點)進行存儲和管理的數據庫。這類數據通常包含時間戳(Timestamp)和對應的數值,例如傳感器讀數、服務器監控指標、金融交易記錄等。時序數據庫的核心特點是高效處理時間范圍內的聚合查詢、高頻數據寫入和時間窗口分析。
?
我們通過與關系型數據庫的對比來詳細了解時序數據庫
關系數據庫?:采用表格形式存儲數據,每個表格由行和列組成,行代表記錄,列代表字段。數據之間的關系通過外鍵和表連接來維護,在復雜查詢、多表關聯查詢和事務處理方面表現出色。然而,在處理大規模時間序列數據時,查詢性能可能會下降。適用于需要復雜查詢、事務處理和數據一致性的應用場景,如企業資源規劃(ERP)、客戶關系管理(CRM)等。
時序數據庫?:專為時間序列數據設計,數據通常按照時間戳排序存儲。時序數據庫支持高效的時間范圍查詢、聚合和插值等操作。針對時間序列數據的查詢進行了優化,能夠高效地處理時間范圍查詢、數據聚合和降采樣等操作。適用于需要實時監控、數據分析和預測的應用場景,如物聯網(IoT)、金融交易、能源管理等。
二、KWDB時序數據庫特性使用
KWDB 時序數據庫支持在創建數據庫的時候設置數據庫的生命周期和分區時間范圍,我們創建數據庫到創建表來完整體驗時序特性
1、kwdb時序數據庫特性使用
1)時序數據庫創建
同一數據庫實例可以創建一個或多個時序庫,時序庫只包含時序表,同理時序表也智能創建在時序庫。
CREATE TS DATABASE <db_name> [RETENTIONS <keep_duration>] [PARTITION INTERVAL <interval>];
參數說明
參數 | 說明 |
---|---|
db_name | 待創建的數據庫的名稱。該名稱必須唯一,且遵循數據庫標識符規則。目前,數據庫名稱不支持中文字符,最大長度不能超過 63 個字節。 |
keep_duration | 可選參數。指定數據庫的生命周期,默認值為?0d ,即不會過期刪除。支持配置的時間單位包括:秒(S 或 SECOND)、分鐘(M 或 MINUTE)、小時(H 或 HOUR)、天(D 或 DAY)、周(W 或 WEEK)、月(MON 或 MONTH)、年(Y 或 YEAR),例如?RETENTIONS 10 DAY 。取值必須是整數值,最大值不得超過?1000 ?年。 |
interval | 可選參數,指定數據庫數據目錄分區的時間范圍。默認值為?10d ,即每 10 天進行一次分區。支持配置的時間單位包括:天(D 或 DAY)、周(W 或 WEEK)、月(MON 或 MONTH)、年(Y 或 YEAR)。取值必須是整數值,最大值不得超過?1000 ?年 |
示例
創建一個普通的時序數據庫
CREATE TS DATABASE banjin_tsdb;
root@192.168.150.135:26257/rdb> CREATE TS DATABASE banjin_tsdb;
CREATE TS DATABASE
Time: 3.406977ms
創建一個帶生命周期時序數據庫
CREATE TS DATABASE banjin_tsdb_life RETENTIONS 4w;? -----生命周期4周
root@192.168.150.135:26257/rdb> CREATE TS DATABASE banjin_tsdb_life RETENTIONS 4w;
CREATE TS DATABASE
Time: 4.492758ms
創建一個一個帶生命周期并且分區的時序數據庫
CREATE TS DATABASE banjin_tsdb_par RETENTIONS 4w PARTITION INTERVAL 1w;-----生命周期為4周與分區間隔為1周
root@192.168.150.135:26257/rdb> CREATE TS DATABASE banjin_tsdb_par RETENTIONS 4w PARTITION INTERVAL 1w;
CREATE TS DATABASE
Time: 3.662981ms
2)查詢數據庫
#查看已創建的數據庫
SHOW DATABASES;
#查看數據庫的詳細信息和創建
SHOW CREATE DATABASE <database_name>;
show create database?banjin_tsdb_life;
#查看數據庫中的表
SHOW TABLES FROM<database_name>;
##TIME SERIES 為時序庫
##RELATIONAL 為關系庫
root@192.168.150.135:26257/rdb> SHOW DATABASES;
database_name | engine_type
-------------------+--------------
banjin_tsdb | TIME SERIES
banjin_tsdb_life | TIME SERIES
banjin_tsdb_par | TIME SERIES
defaultdb | RELATIONAL
postgres | RELATIONAL
rdb | RELATIONAL
system | RELATIONAL
tsdb | TIME SERIES
(8 rows)
Time: 2.407129ms
root@192.168.150.135:26257/rdb>
root@192.168.150.135:26257/rdb>?show create database banjin_tsdb_life;? ----帶生命周期
database_name | create_statement
-------------------+--------------------------------------
banjin_tsdb_life | CREATE TS DATABASE banjin_tsdb_life
| retentions 2419200s
| partition interval 10d
(1 row)
Time: 1.211434ms
root@192.168.150.135:26257/rdb>?show create database banjin_tsdb_par; ----帶生命周期和分區
database_name | create_statement
------------------+-------------------------------------
banjin_tsdb_par | CREATE TS DATABASE banjin_tsdb_par
| retentions 2419200s
| partition interval 7d? ? ---在此我們可以看到周其實也是轉換為d(天)
(1 row)
Time: 1.195576ms
在此我們剛好驗證到了:創建數據庫時,如果指定?retentions
?和?partition interval
?參數的取值,則顯示指定的取值。如未指定,則顯示該參數的默認值。默認情況下,retentions
?參數的取值為?0s
,partition interval
?參數的取值為?10d
。
3)數據庫的修改
數據庫修改支持修改數據庫名稱、修改數據生命周期或分區時間范圍
#修改名稱
ALTER DATABASE <old_name> RENAME TO <new_name>;
#修改數據生命周期或分區時間范圍
ALTER TS DATABASE <db_name> SET [RETENTIONS = <keep_duration> | PARTITION INTERVAL = <interval> ];
參數介紹:
參數 | 說明 |
---|---|
old_name | 當前數據庫的名稱。 |
new_name | 擬修改的數據庫名稱,新數據庫名稱必須唯一,并且遵循數據庫標識符規則。目前,數據庫名稱不支持中文字符,最大長度不能超過 63 個字節。 |
db_name | 待修改的數據庫名稱。 |
keep_duration | 數據庫的生命周期,默認值為?0d ,即不會過期刪除。支持配置的時間單位包括:秒(S 或 SECOND)、分鐘(M 或 MINUTE)、小時(H 或 HOUR)、天(D 或 DAY)、周(W 或 WEEK)、月(MON 或 MONTH)、年(Y 或 YEAR),例如?RETENTIONS 10 DAY 。取值必須是整數值,最大值不得超過?1000 ?年。 |
interval | 可選參數,指定數據庫數據目錄分區的時間范圍。默認值為?10d ,即每 10 天進行一次分區。支持配置的時間單位包括:天(D 或 DAY)、周(W 或 WEEK)、月(MON 或 MONTH)、年(Y 或 YEAR)。取值必須是整數值,最大值不得超過?1000 ?年 |
ALTERroot@192.168.150.135:26257/rdb> ALTER DATABASE banjin_tsdb RENAME TO banjin_tsdb_re; ----修改名稱
RENAME DATABASE
Time: 3.381247ms
root@192.168.150.135:26257/rdb>
root@192.168.150.135:26257/rdb> ALTER TS DATABASE banjin_tsdb_par SET RETENTIONS = 10 day; ---修改生命周期
ALTER TS DATABASE
Time: 2.554524ms
root@192.168.150.135:26257/rdb>
root@192.168.150.135:26257/rdb> ALTER TS DATABASE banjin_tsdb_par SET PARTITION INTERVAL = 2 day; ---修改分區時間范圍
ALTER TS DATABASE
Time: 2.169787ms
root@192.168.150.135:26257/rdb> SHOW DATABASES;
database_name | engine_type
-------------------+--------------
banjin_tsdb_life | TIME SERIES
banjin_tsdb_par | TIME SERIES
banjin_tsdb_re | TIME SERIES
defaultdb | RELATIONAL
postgres | RELATIONAL
rdb | RELATIONAL
system | RELATIONAL
tsdb | TIME SERIES
(8 rows)
Time: 1.461412ms
root@192.168.150.135:26257/rdb> show create database banjin_tsdb_par;
database_name | create_statement
------------------+-------------------------------------
banjin_tsdb_par | CREATE TS DATABASE banjin_tsdb_par
| retentions 864000s
| partition interval 2d
(1 row)
?Time: 1.216081ms?DATABASE banjin_tsdb RENAME TO banjin_tsdb_re;
4)刪除數據庫
DROP DATABASE [IF EXISTS] <db_name> [CASCADE];
#刪除數據庫
DROP DATABASE banjin_tsdb_re;
#在有數據庫對象是可以級聯刪除?
?DROP DATABASE banjin_tsdb_re CASCADE;
root@192.168.150.135:26257/rdb> DROP DATABASE tsdb;
ERROR: rejected: DROP DATABASE on non-empty database without explicit CASCADE (sql_safe_updates = true)
SQLSTATE: 01000
root@192.168.150.135:26257/rdb> DROP DATABASE tsdb cascade;
DROP DATABASE
Time: 49.574938ms
2、時序表的使用
了解完時序庫,接著了解時序表,當然時序表就是同時序庫是配套的
1)時序表創建
#語法格式
CREATE TABLE <table_name> (<column_list>)
[TAGS|ATTRIBUTES] (<tag_list>)
PRIMARY [TAGS|ATTRIBUTES] (<primary_tag_list>)
[RETENTIONS <keep_duration>]
[ACTIVETIME <active_duration>]
[PARTITION INTERVAL <interval>]
[DICT ENCODING];CREATE TABLE meter_data (
ts TIMESTAMPTZ(3) NOT NULL,? ?-----第一列,數據類型必須是 TIMESTAMPTZ 或 TIMESTAMP 且非空,用于記錄數據采集的時間。
voltage FLOAT8 NULL,
current FLOAT8 NULL,
power FLOAT8 NULL,
energy FLOAT8 NULL
) TAGS (
meter_id VARCHAR(50) NOT NULL )-----用于記錄采集對象的靜態數據。?PRIMARY TAGS(meter_id) -----主標簽用于區分不同的實體。每張表需要指定至少一個主標簽,主標簽需要在建表時指定,且后續不允許修改或刪除主表簽。
retentions 30d? ?-----可選參數,指定表的生命周期。超過設置的生命周期后,系統自動從數據庫中清除目標表中數據。默認值為?0d
,即不會過期刪除。
activetime 20d? ?-----可選參數,指定數據的活躍時間。超過設置的時間后,系統自動壓縮表數據。
partition interval 10d? ?-----可選參數,指定表數據目錄分區的時間范圍。默認值為?10d。
dict encoding;---可選參數,啟用字符串的字典編碼功能,提升字符串數據的壓縮能力,且只能在建表時開啟。開啟后不支持禁用。
參數詳細介紹
參數 | 說明 |
---|---|
table_name | 待創建的時序表的名稱,表名的最大長度為 128 字節。在指定數據庫中,時序表名稱必須唯一,并且遵循數據庫標識符規則。 |
column_list | 待創建的數據列列表,支持添加兩個以上的列定義,最多可指定 4096 列。列定義包括列名、數據類型和默認值。 列名的最大長度為 128 字節,支持指定 NOT NULL,默認為空值。支持自定義第一列的列名,但數據類型必須是 TIMESTAMPTZ 或 TIMESTAMP 且非空。默認時區為 UTC。 對于非時間類型的數據列,默認值只能是常量。對于時間類型的列(TIMESTAMPTZ 或 TIMESTAMP),默認值可以是常量,也可以是? now() ?函數。如果默認值類型與列類型不匹配,設置默認值時,系統報錯。支持默認值設置為 NULL。時間戳列支持設置時間精度。目前,KWDB 支持毫秒、微秒和納秒的時間精度。默認情況下,KWDB 采用毫秒時間精度。 |
tag_list | 標簽列表,支持添加一個或多個標簽定義,最多可指定?128 ?個標簽。標簽定義包含標簽名和數據類型,標簽名的最大長度為 128 字節,支持指定 NOT NULL,默認為空值。不支持 TIMESTAMP、TIMESTAMPTZ、NVARCHAR 和 GEOMETRY 數據類型。 |
primary_tag_list | 主標簽列表,支持添加一個或多個主標簽名稱,最多可指定?4 ?個。主標簽必須包含在標簽列表內且指定為 NOT NULL,不支持浮點類型和除 VARCHAR 之外的變長數據類型。VARCHAR 類型長度默認?64 ?字節,最大長度為?128 ?字節。 |
keep_duration | 可選參數,指定表的生命周期。超過設置的生命周期后,系統自動從數據庫中清除目標表中數據。默認值為?0d ,即不會過期刪除。支持配置的時間單位包括:秒(S 或 SECOND)、分鐘(M 或 MINUTE)、小時(H 或 HOUR)、天(D 或 DAY)、周(W 或 WEEK)、月(MON 或 MONTH)、年(Y 或 YEAR)。取值必須是整數值,最大值不得超過?1000 ?年。說明 - 當用戶單獨指定或者修改數據庫內某一時序表的生命周期或分區時間范圍時,該配置只適用于該時序表。 - 生命周期的配置不適用于當前分區。當生命周期的取值小于分區時間范圍的取值時,即使表的生命周期已到期,由于數據存儲在當前分區中,用戶仍然可以查詢數據。 - 當時間分區的所有數據超過生命周期時間點( now() - retention time )時,系統嘗試刪除該分區的數據。如果此時用戶正在讀寫該分區的數據,或者系統正在對該分區進行壓縮或統計信息處理等操作,系統無法立即刪除該分區的數據。系統會在下一次生命周期調度時再次嘗試刪除數據(默認情況下,每小時調度一次)。- 生命周期和分區時間范圍設置與系統的存儲空間密切相關。生命周期越長,分區時間范圍越大,系統所需的存儲空間也越大。有關存儲空間的計算公式,參見預估磁盤使用量。 |
active_duration | 可選參數,指定數據的活躍時間。超過設置的時間后,系統自動壓縮表數據。默認值為?1d ,表示系統對表數據中 1 天前的分區進行壓縮。支持配置的時間單位包括:秒(S 或 SECOND)、分鐘(M 或 MINUTE)、小時(H 或 HOUR)、天(D 或 DAY)、周(W 或 WEEK)、月(MON 或 MONTH)、年(Y 或 YEAR)。默認時間單位為天(D 或 DAY)。取值必須是整數值,最大值不得超過?1000 ?年。如果設置為?0 ,表示不壓縮表數據。 |
interval | 可選參數,指定表數據目錄分區的時間范圍。默認值為?10d ,即每 10 天進行一次分區。支持配置的時間單位包括:天(D 或 DAY)、周(W 或 WEEK)、月(MON 或 MONTH)、年(Y 或 YEAR)。取值必須是整數值,最大值不得超過?1000 ?年。 |
DICT ENCODING | 可選參數,啟用字符串的字典編碼功能,提升字符串數據的壓縮能力。表中存儲的字符串數據重復率越高,壓縮優化效果越明顯。該功能只適用于 CHAR 和 VARCHAR 長度小于等于?1023 ?的字符串,且只能在建表時開啟。開啟后不支持禁用 |
示例
#創建一個時序表
CREATE TABLE meter_data1 (
ts TIMESTAMPTZ(3) NOT NULL,
voltage FLOAT8 NULL,
current FLOAT8 NULL,
power FLOAT8 NULL,
energy FLOAT8 NULL
) TAGS (
meter_id VARCHAR(50) NOT NULL )
PRIMARY TAGS(meter_id);#創建一個生命周期30d和分區時間范圍10的時序表
CREATE TABLE meter_data2 (
ts TIMESTAMPTZ(3) NOT NULL,
voltage FLOAT8 NULL,
current FLOAT8 NULL,
power FLOAT8 NULL,
energy FLOAT8 NULL
) TAGS (
meter_id VARCHAR(50) NOT NULL )
PRIMARY TAGS(meter_id)
retentions 30d
partition interval 10d;#創建一個活躍時間為20的時序表
CREATE TABLE meter_data3 (
ts TIMESTAMPTZ(3) NOT NULL,
voltage FLOAT8 NULL,
current FLOAT8 NULL,
power FLOAT8 NULL,
energy FLOAT8 NULL
) TAGS (
meter_id VARCHAR(50) NOT NULL )
PRIMARY TAGS(meter_id)
activetime 20d
dict encoding;
root@192.168.150.135:26257/banjin_tsdb_par> show create table meter_data1;
table_name | create_statement
--------------+-------------------------------------------------------------
meter_data1 | CREATE TABLE meter_data1 (
| ts TIMESTAMPTZ(3) NOT NULL,
| voltage FLOAT8 NULL,
| current FLOAT8 NULL,
| power FLOAT8 NULL,
| energy FLOAT8 NULL
| ) TAGS (
| meter_id VARCHAR(50) NOT NULL ) PRIMARY TAGS(meter_id)
| retentions 864000s
| activetime 1d
| partition interval 2d
(1 row)
Time: 145.235397ms
root@192.168.150.135:26257/banjin_tsdb_par> show create table meter_data2;
table_name | create_statement
--------------+-------------------------------------------------------------
meter_data2 | CREATE TABLE meter_data2 (
| ts TIMESTAMPTZ(3) NOT NULL,
| voltage FLOAT8 NULL,
| current FLOAT8 NULL,
| power FLOAT8 NULL,
| energy FLOAT8 NULL
| ) TAGS (
| meter_id VARCHAR(50) NOT NULL ) PRIMARY TAGS(meter_id)
| retentions 30d
| activetime 1d
| partition interval 10d
(1 row)
Time: 125.359513ms
root@192.168.150.135:26257/banjin_tsdb_par> show create table meter_data3;
table_name | create_statement
--------------+-------------------------------------------------------------
meter_data3 | CREATE TABLE meter_data3 (
| ts TIMESTAMPTZ(3) NOT NULL,
| voltage FLOAT8 NULL,
| current FLOAT8 NULL,
| power FLOAT8 NULL,
| energy FLOAT8 NULL
| ) TAGS (
| meter_id VARCHAR(50) NOT NULL ) PRIMARY TAGS(meter_id)
| retentions 864000s
| activetime 20d DICT ENCODING
| partition interval 2d
(1 row)
Time: 127.519057ms
時序表必須創建在時序庫里,當在關系庫創建時序表時報錯如下
2)時序表修改
語法格式:
ALTER TABLE <table_name>
[ADD [COLUMN] [IF NOT EXISTS] <colunm_name> <data_type> [DEFAULT <expr> | NULL ]
|ADD [TAG | ATTRIBUTE] <tag_name> <tag_type>
|ALTER [COLUMN] <colunm_name> [SET DATA] TYPE <new_type> [SET DEFAULT <default_expr> | DROP DEFAULT ]
|ALTER [TAG | ATTRIBUTE] <tag_name> [SET DATA] TYPE <new_type>
|DROP [COLUMN] [IF EXISTS] <colunm_name>
|DROP [TAG | ATTRIBUTE] <tag_name>
|RENAME TO <new_table_name>
|RENAME COLUMN <old_name> TO <new_name>
|RENAME [TAG | ATTRIBUTE] <old_name> TO <new_name>
|SET [RETENTIONS = <keep_duration> | ACTIVETIME = <active_duration> | PARITITION INTERVAL = <interval>]];
一些時序表特有示例
更多修改用例可參考官網:https://www.kaiwudb.com/kaiwudb_docs/#/oss_v2.2.0/db-administration/db-object-mgmt/ts-db/table-mgmt-ts.html
-- 修改表的生命周期。
ALTER TABLE ts_table SET RETENTIONS = 20d;
-- 修改表數據的活躍時間。
ALTER TABLE ts_table SET ACTIVETIME = 20d;
-- 修改表數據目錄分區的時間范圍。
ALTER TABLE ts_table SET PARTITION INTERVAL = 2d;
-- 新增標簽。
ALTER TABLE ts_table ADD TAG color VARCHAR(30);
-- 刪除標簽。
ALTER TABLE ts_table DROP TAG color;
-- 修改標簽名。
ALTER TABLE ts_table RENAME TAG site TO location;
-- 修改標簽的寬度。
ALTER TABLE ts_table ALTER color TYPE VARCHAR(50);
3)時序表查詢
#查看當前數據庫下所有表
SHOW TABLES;
#查看特定數據庫下的所有表
SHOW TABLES FROM tablename;
#查看表的詳細介紹及創建語句
SHOW CREATE TABLE tablename;
SHOW CREATE TABLE database.tablename;
root@192.168.150.135:26257/banjin_tsdb_par> show tables;
table_name | table_type
--------------+--------------------
meter_data1 | TIME SERIES TABLE
meter_data2 | TIME SERIES TABLE
meter_data3 | TIME SERIES TABLE
(3 rows)
Time: 2.194141ms
root@192.168.150.135:26257/banjin_tsdb_par> show create meter_data2;
table_name | create_statement
--------------+-------------------------------------------------------------
meter_data2 | CREATE TABLE meter_data2 (
| ts TIMESTAMPTZ(3) NOT NULL,
| voltage FLOAT8 NULL,
| current FLOAT8 NULL,
| power FLOAT8 NULL,
| energy FLOAT8 NULL
| ) TAGS (
| meter_id VARCHAR(50) NOT NULL ) PRIMARY TAGS(meter_id)
| retentions 30d
| activetime 1d
| partition interval 10d
(1 row)
Time: 128.253929ms
三、KWDB的跨模查詢
跨模查詢是一種用于在不同類型數據庫之間檢索相關聯數據的查詢技術。它允許用戶在例如關系數據庫和時序數據庫等不同類型的數據庫系統間,查找和獲取相關的數據。
可以使用SampleDB來直接體驗跨模查詢,SampleDB 是一個用于展示示例數據與場景的項目。其核心目標是助力用戶快速掌握 KWDB 數據庫的使用方法,為用戶提供便捷的測試與學習環境,SampleDB數據庫模型是一個智能電表項目,包含關系庫rdb和時序庫tsdb,提供了關系表和時序表的表結構及數據,還提供了很多用例
下載地址:登錄 - Gitee.com
官網地址:smart-meter/scenario.md · KWDB/SampleDB - Gitee.com
下載后上傳服務器解壓
mkdir cd /var/lib/kaiwudb/extern
#上傳rdb.tar.gz,tsdb.tar.gz到此目錄
cd /var/lib/kaiwudb/extern
tar xvf rdb.tar.gz
tar xvf tsdb.tar.gz
導入關系庫 rdb 數據
import database csv data ("nodelocal://1/rdb");
#登錄
?kwbase sql --certs-dir=/etc/kaiwudb/certs --host=192.168.150.135
#導入
import database csv data ("nodelocal://1/rdb");
root@192.168.150.135:26257/defaultdb> import database csv data ("nodelocal://1/rdb");
job_id | status | fraction_completed | rows | abandon_rows | reject_rows | note
----------------------+-----------+--------------------+------+--------------+-------------+-------
1073655494850838529 | succeeded | 1 | 305 | 0 | 0 | None
(1 row)
Time: 157.913643ms#驗證 --切換rdb數據庫登錄
root@192.168.150.135:26257/defaultdb> use rdb;
SET
Time: 403.717μsroot@192.168.150.135:26257/rdb> show tables;
table_name | table_type
--------------+-------------
alarm_rules | BASE TABLE
area_info | BASE TABLE
meter_info | BASE TABLE
user_info | BASE TABLE
(4 rows)
導入時序庫 tsdb 數據
import database csv data ("nodelocal://1/tsdb");
#導入
root@192.168.150.135:26257/rdb> import database csv data ("nodelocal://1/tsdb");
job_id | status | fraction_completed | rows | abandon_rows | reject_rows | note
---------+-----------+--------------------+-------+--------------+-------------+-------
- | succeeded | 1 | 10100 | 0 | 0 | None
(1 row)
Time: 526.048817msroot@192.168.150.135:26257/rdb> \q
#切換tsdb數據庫
root@192.168.150.135:26257/defaultdb> use rdb;
SET
Time: 403.717μsroot@192.168.150.135:26257/tsdb> show tables;
table_name | table_type
-------------+--------------------
meter_data | TIME SERIES TABLE
(1 row)
Time: 1.576363ms
場景實例
告警檢測查詢
SELECT md.meter_id,md.ts,ar.rule_name,md.voltage,md.current,md.power FROM tsdb.meter_data md --時序表 JOIN rdb.alarm_rules ar ON 1=1 --關系表 WHERE (ar.metric = 'voltage' AND ((ar.operator = '>' AND md.voltage < ar.threshold) OR (ar.operator = '<' AND md.voltage > ar.threshold)))OR (ar.metric = 'current' AND md.current > ar.threshold)OR (ar.metric = 'power' AND md.power > ar.threshold) ORDER BY md.ts DESC LIMIT 100;
root@192.168.150.135:26257/banjin_tsdb_par> SELECT
-> md.meter_id,
-> md.ts,
-> ar.rule_name,
-> md.voltage,
-> md.current,
-> md.power
-> FROM tsdb.meter_data md
-> JOIN rdb.alarm_rules ar ON 1=1
-> WHERE (ar.metric = 'voltage'
-> AND ((ar.operator = '>' AND md.voltage < ar.threshold)
-> OR (ar.operator = '<' AND md.voltage > ar.threshold)))
-> OR (ar.metric = 'current' AND md.current > ar.threshold)
-> OR (ar.metric = 'power' AND md.power > ar.threshold)
-> ORDER BY md.ts DESC
-> LIMIT 100;
meter_id | ts | rule_name | voltage | current | power
-----------+-------------------------------+-----------+---------+---------+--------
M2 | 2025-04-08 08:47:24.22+00:00 | 高壓告警 | 221 | 5.1 | 1050
M2 | 2025-04-08 08:47:24.22+00:00 | 低壓告警 | 221 | 5.1 | 1050
M2 | 2025-04-08 08:42:35.898+00:00 | 高壓告警 | 221 | 5.1 | 1050
.........
M26 | 2025-04-08 04:47:24.22+00:00 | 低壓告警 | 225 | 6 | 1250
M26 | 2025-04-08 04:47:24.22+00:00 | 高壓告警 | 225 | 6 | 1250
M26 | 2025-04-08 04:42:35.898+00:00 | 低壓告警 | 225 | 6 | 1250
M26 | 2025-04-08 04:42:35.898+00:00 | 高壓告警 | 225 | 6 | 1250
(100 rows)
Time: 107.937794ms
區域用電量top10
SELECT a.area_name,SUM(md.energy) AS total_energy FROM tsdb.meter_data md --時序表 JOIN rdb.meter_info mi ON md.meter_id = mi.meter_id --關系表 JOIN rdb.area_info a ON mi.area_id = a.area_id GROUP BY a.area_name ORDER BY total_energy DESC LIMIT 10;
root@192.168.150.135:26257/tsdb> SELECT
-> a.area_name,
-> SUM(md.energy) AS total_energy
-> FROM tsdb.meter_data md
-> JOIN rdb.meter_info mi ON md.meter_id = mi.meter_id
-> JOIN rdb.area_info a ON mi.area_id = a.area_id
-> GROUP BY a.area_name
-> ORDER BY total_energy DESC
-> LIMIT 10;
area_name | total_energy
------------+---------------
Area 2 | 5.556e+06
Area 1 | 5.55499e+06
Area 100 | 5.55398e+06
Area 99 | 5.55297e+06
Area 98 | 5.55196e+06
Area 97 | 5.55095e+06
Area 96 | 5.54994e+06
Area 95 | 5.54893e+06
Area 94 | 5.54792e+06
Area 93 | 5.54691e+06
(10 rows)
Time: 21.137013ms
KWDB 跨模查詢支持的詳細項:
KWDB 跨模查詢支持以下關聯查詢:
- 內連接(INNER JOIN)
- 左連接(LEFT JOIN)
- 右連接(RIGHT JOIN)
- 全連接(FULL JOIN)
KWDB 跨模查詢支持以下嵌套查詢:
- 相關子查詢(Correlated Subquery):內部查詢依賴于外部查詢的結果,每次外部查詢的都觸發內部查詢的執行。
- 非相關子查詢(Non-Correlated Subquery):內部查詢獨立于外部查詢,只執行一次內部查詢并返回固定的結果。
- 相關投影子查詢(Correlated Scalar Subquery): 內部查詢依賴于外部查詢的結果,并且只返回一個單一的值作為外部查詢的結果。
- 非相關投影子查詢(Non-Correlated Scalar Subquery):內部查詢獨立于外部查詢,并且只返回一個單一的值作為外部查詢的結果。
FROM
?子查詢:將一個完整的 SQL 查詢嵌套在另一個查詢的?FROM
?子句中,作為臨時表格使用。
KWDB 跨模查詢支持以下聯合查詢:
- UNION:合并多個查詢結果集,并去除重復行。
- UNION ALL:合并多個查詢結果集,但不去除重復行。
- INTERSECT:返回兩個查詢結果集中都存在的所有行,去除重復行。
- INTERSECT ALL:返回兩個查詢結果集中都存在的所有行,但不去除重復行。
- EXCEPT:返回第一個查詢結果集中不包含在第二個結果集中的行,去除重復行。
- EXCEPT ALL:返回第一個查詢結果集中不包含在第二個結果集中的行,不去除重復行。
四、時序特性的注意事項
1、當一個時序數據庫指定了生命周期或分區時間范圍時,單獨指定或者修改數據庫內某一時序表的生命周期或分區時間范圍時,該配置只適用于該時序表。所以在如果表生命周期或分區時間范圍在使用時如果不符合設定,要檢查表的生命周期或分區時間范圍是否單獨設置了
2、生命周期的配置不適用于當前分區(指定表數據目錄分區的時間范圍的表分區)。當生命周期的取值小于分區時間范圍的取值時,即使數據庫的生命周期已到期,由于數據存儲在當前分區中,用戶仍然可以查詢數據。當時間分區的所有數據超過生命周期時間點(now() - retention time
)時,系統嘗試刪除該分區的數據。如果此時用戶正在讀寫該分區的數據,或者系統正在對該分區進行壓縮或統計信息處理等操作,系統無法立即刪除該分區的數據。系統會在下一次生命周期調度時再次嘗試刪除數據(默認情況下,每小時調度一次)。
3、數據庫生命周期和分區時間范圍的設置與系統的存儲空間密切相關。生命周期越長,分區時間范圍越大,系統所需的存儲空間也越大。