Hace unos días publicábamos el primer post dedicado a esta interesante base de datos Time Series: ¿Qué es TimescaleDB?
Hoy vamos a profundizar un poco en el concepto de hypertable.
Como vimos el concepto principal de TimescaleDB (Que funciona sobre Postgresql) es el hypertable. TimescaleDB de hecho se monta como una extensión de Postgresql:
Al ser una extensión puedo utilizar el mismo driver de Postgresql (el JDBC en nuestro caso).
Creación de hypertable
Una vez tenemos la extensión para crear una hypertable crearé mi tabla como normalmente:
Y luego la convierto a hypertable indicando el campo por el que particionamos:
Una vez hecho esto puedo hacer las operaciones SQL normalmente:
Opciones hypertable
A la hora de crear la hypertable puedo configurar un conjunto de opciones, como el intervalo de tiempo por defecto (que si no se establece es de 7 días), podemos cambiarlo así:
También puedo configurar las space partitions.
Best Practices sobre hypertables:
Podéis leer más sobre las Best Practices aquí:
https://docs.timescale.com/v1.3/using-timescaledb/hypertables#best-practices
Índices hypertable
Cuando se crea una hypertable se crea un índice temporal así:
Si a la hora de crear la hypertable especificamos un space partition se creará un índice de este tipo:
Soporte JSON en Hypertable
TimescaleDB puede trabajar con los mismos tipos de datos que Postgresql, incluido JSON y JSONB lo que es una opción muy interesante para muchos escenarios.
Se recomienda:
- Usar el tipo de dato JSONB (Json binario) que son más eficientes en almacenamiento y búsqueda
- Una aproximación semiestructurada donde los campos como time, user_id, device_id estén fuera de la estructura JSONB ya que el acceso es más eficiente
TimescaleDB también soporta crear índices sobre una estructura JSONB entera (índices GIN) o incluso sobre un campo dentro del JSONB.
Inserciones múltiples y upserts
Además de los INSERTs normales TimescaleDB soporta inserciones de múltiples filas en una hypertable con un único INSERT:
+
También tengo el concepto de UPSERT, que me permite gestionar conflictos en las inserciones:
Queries
TimescaleDB y sus hypertables se comportan igual que una tabla Postgresql, por tanto puedo hacer JOINS entre tablas normales e hypertables:
Además de queries complejas:
Además de queries analíticas como la medias, mediana, percentil, sumatorios, histogramas, relleno de huecos,…
Más info sobre estas queries: https://docs.timescale.com/v1.3/using-timescaledb/reading-data