首页
解决方案
技术服务
专业数据库维保服务 大数据维保服务
一体机
Oracle数据库一体机 PolarDB数据库一体机 瀚高数据库一体机 崖山数据库一体机 海扬数据库一体机 高斯数据库一体机 金仓数据库一体机
产品
CLup乘数云统一平台 CData高性能数据库云一体机 CPDA高性能双子星数据库机 CBackup数据库备份恢复云平台 CMiner: PostgreSQL中的CDC CSYun超融合虚拟机产品 ZQPool数据库连接池 ConshGuard数据保护产品 APCC: Greenplum管理平台
文档
文章
客户及伙伴
中启开源
关于我们
登录
×
修改密码

TimeScaleDB 简介

面对如上需求时传统数据库不太能很好进行支持

TimescaleDB是基于PostgreSQL数据库打造的一款时序数据库支持完整SQL语言,插件化的形式,随着PostgreSQL的版本升级而升级,不会因为另立分支带来麻烦。

TimeScaleDB特点

  1. 基于时序优化

  2. 自动分片(按时间、空间自动分片(chunk))

  3. 全SQL接口

  4. 支持垂直于横向扩展

  5. 支持时间维度、空间维度自动分区。空间维度指属性字段(例如传感器ID,用户ID等)。

  6. 支持多个SERVER,多个CHUNK的并行查询。分区在TimeScaleDB中被称为chunk。

  7. 自动调整CHUNK的大小。

  8. 内部写优化(批量提交、内存索引、事务支持、数据倒灌)。
    内存索引,因为chunk size比较适中,所以索引基本上都不会被交换出去,写性能比较好。
    数据倒灌,因为有些传感器的数据可能写入延迟,导致需要写以前的chunk,TimeScaleDB允许这样的事情发生(可配置)。

  9. 复杂查询优化(根据查询条件自动选择chunk,最近值获取优化(最小化的扫描,类似递归收敛),limit子句pushdown到不同的server,chunks,并行的聚合操作)。

  10. 利用已有的PostgreSQL特性(支持GIS,JOIN等),方便的管理(流复制、PITR)。

  11. 支持自动的按时间保留策略(自动删除过旧数据)。

一.Postgresql安装TimeScaleDB插件

  1. CREATE TABLE "locations"(
  2. device_id TEXT,
  3. location TEXT,
  4. environment TEXT
  5. );
  6. DROP TABLE IF EXISTS "conditions";
  7. CREATE TABLE "conditions"(
  8. time TIMESTAMP WITH TIME ZONE NOT NULL,
  9. device_id TEXT,
  10. temperature NUMERIC,
  11. humidity NUMERIC
  12. );
  13. CREATE INDEX ON "conditions"(time DESC);
  14. CREATE INDEX ON "conditions"(device_id, time DESC);
  15. -- 86400000000 is in usecs and is equal to 1 day
  16. SELECT create_hypertable('conditions', 'time', chunk_time_interval => 86400000000);

二. 查询数据

Timescaledb首先支持常见的DML,DDL等语句,与其他数据库SQL语句相比并无多大差异,但不同的是timescaledb提供了更加全面,侧重于功能性查询的SQL,最主要的还是依赖其丰富的函数,通过几个实际会用到的例子来展示下TimeScaledb的特点:

  1. SELECT time_bucket('15 minutes', time) AS fifteen_min,
  2. device_id, COUNT(*),
  3. MAX(temperature) AS max_temp,
  4. avg(temperature) AS avg_temp,
  5. MAX(humidity) AS max_hum
  6. FROM conditions
  7. WHERE time > '2016-12-06 00:00:00'
  8. and device_id='weather-pro-000446'
  9. GROUP BY fifteen_min, device_id
  10. ORDER BY fifteen_min, max_temp DESC;
  11. fifteen_min | device_id | count | max_temp | avg_temp | max_hum
  12. ------------------------+--------------------+-------+-------------------+---------------------+-------------------
  13. 2016-12-06 00:00:00+08 | weather-pro-000446 | 7 | 87.00000000000023 | 86.9571428571430886 | 80.99999999999967
  14. 2016-12-06 00:15:00+08 | weather-pro-000446 | 7 | 87.4000000000002 | 87.2142857142859286 | 80.79999999999967
  15. 2016-12-06 00:30:00+08 | weather-pro-000446 | 8 | 87.6000000000002 | 87.5125000000002000 | 80.99999999999969
  16. 2016-12-06 00:45:00+08 | weather-pro-000446 | 7 | 87.90000000000018 | 87.8142857142858986 | 81.49999999999969
  17. 2016-12-06 01:00:00+08 | weather-pro-000446 | 8 | 88.10000000000016 | 87.9375000000001763 | 82.19999999999969
  18. 2016-12-06 01:15:00+08 | weather-pro-000446 | 7 | 88.30000000000015 | 88.2142857142858714 | 82.4999999999997
  19. 2016-12-06 01:30:00+08 | weather-pro-000446 | 8 | 88.50000000000014 | 88.3625000000001475 | 83.0999999999997
  20. 2016-12-06 01:45:00+08 | weather-pro-000446 | 7 | 88.60000000000014 | 88.5857142857144257 | 83.19999999999969 |
  1. SELECT percentile_cont(0.5) WITHIN GROUP (ORDER BY temperature) from conditions;
  2. percentile_cont
  3. -----------------
  4. 70
  5. (1 row)
  1. SELECT device_id, sum(sum(temperature)) OVER(ORDER BY device_id)
  2. FROM conditions
  3. GROUP BY device_id;
  4. device_id | sum
  5. --------------------+----------------------------
  6. weather-pro-000000 | 1004378.000000000010660
  7. weather-pro-000001 | 2321003.700000002756870
  8. weather-pro-000002 | 3613164.900000005044690
  9. weather-pro-000003 | 4910957.300000007725370
  10. weather-pro-000004 | 6206754.800000009968280
  11. weather-pro-000005 | 6786614.600000009301897
  12. weather-pro-000006 | 8103056.600000011852107
  13. weather-pro-000007 | 9419788.700000014585027

三. 迁移数据

一个普通表有数据是无法成为时序表的,所以必须创建新的一样结构的空表。

  1. #比如有旧表infos,我们可以先
  2. CREATE TABLE new_infos (LIKE infos INCLUDING DEFAULTS INCLUDING CONSTRAINTS EXCLUDING INDEXES);
  3. #Excluding indexes表示不创建和原表一样的索引
  4. #接着
  5. CREATE INDEX on new_infos (time DESC);
  6. CREATE INDEX on new_infos (location,time DESC);
  7. #然后
  8. SELECT create_hypertable('new_infos', 'time');
  9. SELECT create_hypertable('new_infos', 'time','location',4);
  10. #表示另加一个分区条件,以location(例如设备id,用户id等)做为分区依据,再划分成4个chunks。
  11. #最后
  12. INSERT INTO new_infos SELECT * FROM infos;
  13. #也可以用copy命令以csv文件的格式导入其他数据库的数据。

四.相关管理的函数

具体参考地址:http://docs.timescale.com/v0.8/api