Yet Another TimeSeries Database は、 InfluxDbおよびRavenDBに影響を受けた実験的な時系列データベースです。
YATsDb は純粋な.NETと最新のC#で実装され、優れたパフォーマンスを実現します (Intel i7-8550U CPU、1.80 GHz、24 GB RAM、SSD で 1 秒あたり約 30,000 の挿入 - 一度に 1 行ずつ挿入)。
ホーム IoT プロジェクトには時系列データベースが必要でしたが、 InfluxDb を使用するのは退屈でしょう。データの入力方法と問い合わせ方法を知っていたプロトタイプの実装には、わずか 12 時間かかりました。
YATsDb は、GUI、OpenAPI 定義、およびジョブを備えた完全なデータベース実装です。実行するには .NET 8 ランタイムが必要です。
YATsDb.Lite は、コア時系列データベース機能を備えた AOT コンパイル済みバージョンです。ターゲット システムには依存しません。
結果として得られるバイナリは、 15MB 未満の比較的小さいものです。
以下は、cURL を使用したYATsDb/YATsDb.Litleの使用例です ( YATsDb はOpenAPI エンドポイント定義も提供します)。
この例では、ベース URL は http://localhost:8080/ です。
新しいバケットsmart_home
を作成します。
curl -XPOST http://localhost:8080/management/bucket --header " Content-Type: application/json " --data-binary " { " bucketName " : " smart_home " , " description " : null} "
サンプル データを単純な行形式( <measurement>[,<tag>] <value>[,<value>...n] [<timestampInMs>]
) で入力します。この形式はInfluxDbからインスピレーションを得ていますが、名前付きの値は使用しません。 、ただし位置の値。また、 InfluxDbの前では、ミリ秒単位の UNIX タイムスタンプが常に時刻として使用されます。
次のサンプル データは、家庭でのセンサー測定 (温度、湿度、光強度) からのデータを表しています。
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room1 22.0,45,80.4 1719242779202 "
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room1 23.1,39.4,75.0 1719243079200 "
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room1 23.2,41.7,NULL 1719243379246 "
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room2 23.0,41,80.4 1719243379256 "
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room1 22.0,45,80.4 1719243679194 "
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room2 22.7,47.4,NULL 1719243979257 "
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room1 22.1,47,NULL 1719244279035 "
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room3 18.7,NULL,NULL 1719244579031 "
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room1 24.7,51.7,2.4 1719244879109 "
1 つのメッセージで複数行を送信することは可能ですが、すべてのシェルがこれをサポートしているわけではありません。
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room1 24.7,51.7,2.4 1719244879109
sensors_data,Room1 24.8,55.7,3.9 1719244899109 "
YATsDb では、 SQL に似た構文でクエリを実行できますが、名前の代わりに値の位置を使用します。クエリの結果は JSON 結果です。
Room2から 12 時間以上前の湿度データを選択します。
curl -XPOST http://localhost:8080/query/raw/smart_home --data-binary " SELECT AVG(1), MIN(1), MAX(1), COUNT(1) FROM sensors_data WHERE TAG('Room2') AND INTERVAL(NULL, -10h) GROUP BY +10m "
データデータを挿入するための完全な文法 - シンプルなラインプロトコル:
<lines> ::= <line> [ [r]n...n ]
<line> ::= <measurement> <values> [<timestamp>]
<measurement> ::= measurement_name [, tag]
<values> ::= <value> [, ...250]
<value> ::={ double_value | NULL }
<timestamp> ::= unix timestamp in milliseconds
タグなしでの計測:
sensors_data 12.5 1608852317000
タグ付き計測:
sensors_data,home/room3/esp32 12.5 1608852317000
複数の値を使用した測定:
sensors_data,home/room3/esp32 12.5,-14.3,89,47.0036 1608852317000
欠損値のある測定 (欠損値にはNULL
使用):
sensors_data,home/room4/esp32 12.5,NULL,89,47.0036 1608852317000
UNIX タイムスタンプを使用しない測定 - 現在のサーバー時間が使用されます。
sensors_data,home/room3/esp32 12.5
複数行の値:
sensors_data,home/room3/esp32 12.5 1608852317000
pc_data,Workstation1 25.78,47.5,236566 1608852317900
sensors_data,home/room3/esp32 13.5 1608852417000
データをクエリするための完全な文法:
<SELECT statement> ::= SELECT <projection statement> FROM measurement_name
[<WHERE statement>]
[<GROUPBY statement>]
[<LIMIT statement>]
<projection statement> ::= { * | <projection> [ ,...250 ]}
<projection> ::= <projection function>(<index>)
<projection function> ::= { VARIANCE | SUM | COUNT | AVG | IDENTITY | MAX | MIN | STDDEV | REMEDIAN | SIGN | CHANGE_PER_SEC | CHANGE_PER_HOUR | CHANGE_PER_DAY }
<index> ::= integer_number
<WHERE statement> ::= WHERE <where function> [AND ...n]
<where function> ::= { TAG(<string>) | INTERVAL(<interval exp>, <interval exp>) }
<string> ::= string
<interval exp> ::= { integer_number | <time span> | <string> | NOW() }
<time span> ::= { + | - }double_value{ ms | s | m | h | d | w | y }
<GROUPBY statement> ::= GROUP BY <time span>
<LIMIT statement> ::= LIMIT { integer_number | integer_number, integer_number | ..integer_number }
すべてのデータを選択します:
SELECT * FROM sensors_data
Room3から最初の 5 レコードを選択します。
SELECT * FROM sensors_data WHERE TAG('Room3') LIMIT 0,5
10分ごとに温度データグループを選択します:
SELECT AVG(0), MIN(0), MAX(0) FROM sensors_data GROUP BY +10m
Room2から湿度データを選択します。
SELECT AVG(1), MIN(1), MAX(1), COUNT(1) FROM sensors_data WHERE TAG('Room2') GROUP BY +1d
Room2から 12 時間以上前の湿度データを選択します。
SELECT AVG(1), MIN(1), MAX(1), COUNT(1) FROM sensors_data WHERE TAG('Room2') AND INTERVAL(NULL, -12h) GROUP BY +10m
最後のレコードを選択:
SELECT * FROM sensors_data LIMIT ..1
すべてのデータをグループ化します。
SELECT AVG(0), AVG(1), AVG(2) FROM sensors_data
具体的な時間で選択します (ミリ秒単位の UNIX タイムスタンプを使用):
SELECT AVG(0), COUNT(0) FROM sensors_data WHERE INTERVAL(1603519860000, 1608852317000) GROUP BY +10m
具体的な時間で選択します (人間が判読できる時間を使用):
SELECT AVG(0), COUNT(0) FROM sensors_data WHERE INTERVAL('2012-06-12 08:33:12.478', '2012-06-13') GROUP BY +10m