Otra base de datos TimeSeries es una base de datos de series temporales experimental inspirada en InfluxDb y RavenDB .
YATsDb se implementa en .NET puro y C# moderno con un gran rendimiento (alrededor de 30.000 inserciones por segundo en CPU Intel i7-8550U, 1,80 GHz, 24 GB de RAM, SSD; insertando filas una a la vez).
Necesitaba una base de datos de series temporales para proyectos domésticos de IoT, pero usar InfluxDb sería aburrido. La implementación del prototipo, que sabía ingresar datos y realizar consultas, tomó sólo 12 horas.
YATsDb es una implementación de base de datos completa con GUI, definiciones y trabajos de OpenAPI. Requiere el tiempo de ejecución .NET 8 para ejecutarse.
YATsDb.Lite es una versión compilada de AOT con funcionalidad central de base de datos de series temporales. No tiene dependencias de los sistemas de destino.
El binario resultante es relativamente pequeño <15 MB .
El siguiente es un ejemplo del uso de YATsDb/YATsDb.Litle usando cURL ( YATsDb también proporciona una definición de punto final OpenAPI).
En los ejemplos, la URL base es http://localhost:8080/.
Crea un nuevo depósito smart_home
:
curl -XPOST http://localhost:8080/management/bucket --header " Content-Type: application/json " --data-binary " { " bucketName " : " smart_home " , " description " : null} "
Ingrese datos de muestra en formato de línea simple ( <measurement>[,<tag>] <value>[,<value>...n] [<timestampInMs>]
), este formato está inspirado en InfluxDb , pero no utiliza valores con nombre , sino valores posicionales. Además, antes de InfluxDb , la marca de tiempo de Unix en milisegundos siempre se usa como hora.
Los siguientes datos de muestra representan datos de mediciones de sensores en el hogar: temperatura, humedad e intensidad de la luz.
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 "
Es posible enviar varias líneas en un mensaje, pero no todos los shells lo admiten.
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 permite realizar consultas en una sintaxis similar a SQL, pero utiliza posiciones de valores en lugar de nombres. El resultado de la consulta es un resultado JSON.
Seleccione datos de humedad de la Habitación2 de más de 12 horas:
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 "
Gramática completa para insertar datos - protocolo de línea simple:
<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
Medida sin etiqueta:
sensors_data 12.5 1608852317000
Medida con etiqueta:
sensors_data,home/room3/esp32 12.5 1608852317000
Medición con múltiples valores:
sensors_data,home/room3/esp32 12.5,-14.3,89,47.0036 1608852317000
Medición con valores faltantes (use NULL
para el valor faltante):
sensors_data,home/room4/esp32 12.5,NULL,89,47.0036 1608852317000
Medición sin marca de tiempo Unix: se utiliza la hora actual del servidor:
sensors_data,home/room3/esp32 12.5
Valores multilínea:
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
Gramática completa para consultar datos:
<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 }
Seleccione todos los datos:
SELECT * FROM sensors_data
Seleccione los primeros 5 registros de Room3 :
SELECT * FROM sensors_data WHERE TAG('Room3') LIMIT 0,5
Seleccione el grupo de datos de temperatura por 10 minutos:
SELECT AVG(0), MIN(0), MAX(0) FROM sensors_data GROUP BY +10m
Seleccione datos de humedad de Room2 :
SELECT AVG(1), MIN(1), MAX(1), COUNT(1) FROM sensors_data WHERE TAG('Room2') GROUP BY +1d
Seleccione datos de humedad de la Habitación2 de más de 12 horas:
SELECT AVG(1), MIN(1), MAX(1), COUNT(1) FROM sensors_data WHERE TAG('Room2') AND INTERVAL(NULL, -12h) GROUP BY +10m
Seleccione el último registro:
SELECT * FROM sensors_data LIMIT ..1
Agrupar todos los datos:
SELECT AVG(0), AVG(1), AVG(2) FROM sensors_data
Seleccione por tiempo concreto (usando la marca de tiempo de Unix en milisegundos):
SELECT AVG(0), COUNT(0) FROM sensors_data WHERE INTERVAL(1603519860000, 1608852317000) GROUP BY +10m
Seleccione por tiempo concreto (usando tiempo legible por humanos):
SELECT AVG(0), COUNT(0) FROM sensors_data WHERE INTERVAL('2012-06-12 08:33:12.478', '2012-06-13') GROUP BY +10m