TimescaleDB 开源时序数据库

文章目录

      • 1.TimescaleDB介绍
      • 2.Hypertable 和 chunk
      • 3.Hypertable
      • 4.Hypertable操作

  • 开源中间件
# TimescaleDBhttps://iothub.org.cn/docs/middleware/
https://iothub.org.cn/docs/middleware/timescale/timescale-summary/

1.TimescaleDB介绍

TimescaleDB是基于PostgreSQL数据库打造的一款时序数据库,插件化的形式,随着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. 支持自动的按时间保留策略(自动删除过旧数据)
# 官网地址
https://www.timescale.com/# 文档
https://docs.timescale.com/latest/main# 安装
https://docs.timescale.com/latest/getting-started/installation/rhel-centos/installation-yum # github
https://github.com/timescale/timescaledb # docker
https://hub.docker.com/r/timescale/timescaledb

2.Hypertable 和 chunk

TimescaleDB作为PostgreSQL的扩展实现,这意味着Timescale数据库在整个PostgreSQL实例中运行。 该扩展模型允许数据库利用PostgreSQL的许多属性,如可靠性,安全性以及与各种第三方工具的连接性。 同时,TimescaleDB通过在PostgreSQL的查询规划器,数据模型和执行引擎中添加钩子,充分利用扩展可用的高度自定义。
从用户的角度来看,TimescaleDB公开了一些看起来像单数表的称为hypertable的表,它们实际上是一个抽象或许多单独表的虚拟视图,这些表包含称为块的数据。

通过将hypertable的数据划分为一个或多个维度来创建块:所有可编程元素按时间间隔进行分区,并且可以通过诸如设备ID,位置,用户ID等的关键字进行分区。我们有时将此称为分区 横跨“时间和空间”。

  • Hypertable

与数据交互的主要点是一个可以抽象化的跨越所有空间和时间间隔的单个连续表,从而可以通过标准SQL查询它。
实际上,所有与TimescaleDB的用户交互都是使用可调整的。 创建表格和索引,修改表格,插入数据,选择数据等都可以(也应该)在hypertable上执行。

在TimescaleDB中创建一个超表需要两个简单的SQL命令:创建表(使用标准SQL语法),然后选择CLEATEYHYTABLE()。

  • chunk

在内部,TimescaleDB自动将每个可分区块分割成块,每个块对应于特定的时间间隔和分区键空间的一个区域(使用散列)。 这些分区是不相交的(非重叠的),这有助于查询计划人员最小化它必须接触以解决查询的组块集合。
每个块都使用标准数据库表来实现。 (在PostgreSQL内部,这个块实际上是一个“父”可变的“子表”。)
块是正确的大小,确保表的索引的所有B树可以在插入期间驻留在内存中。 这可以避免在修改这些树中的任意位置时发生颠簸。

SELECT show_chunks('conditions');
SELECT show_chunks('conditions', older_than => INTERVAL '3 months');
SELECT show_chunks('conditions', older_than => DATE '2017-01-01');

3.Hypertable

create_hypertableSELECT * FROM create_hypertable(...) # 创建超表
SELECT create_hypertable('conditions', 'time');# 将表条件转换为超表,将chunk_time_interval设置为24小时。 
SELECT create_hypertable('conditions', 'time', chunk_time_interval => 86400000000);
SELECT create_hypertable('conditions', 'time', chunk_time_interval => INTERVAL '1 day');chunk_time_interval 
Interval in event time that each chunk covers. Must be > 0. As of TimescaleDB v0.11.0, default is 7 days. For previous versions, default is 1 month.  # 使用时间分区和位置分区(4个分区)将表条件转换为超表: 
SELECT create_hypertable('conditions', 'time', 'location', 4); 

在这里插入图片描述

  • create_hypertable()
    在这里插入图片描述

  • add_dimension()
    在这里插入图片描述

4.Hypertable操作

1. 创建时序表(hypertable)
# Create a schema for a new hypertable  
CREATE TABLE sensor_data (  
"time" timestamp with time zone NOT NULL,  
device_id TEXT NOT NULL,  
location TEXT NULL,  
temperature NUMERIC NULL,  
humidity NUMERIC NULL,  
pm25 NUMERIC  
);  # Create a hypertable from this data  
SELECT create_hypertable  
('sensor_data', 'time', 'device_id', 16);  2. 迁移数据到hyper table
# Migrate data from existing Postgres table into  
# a TimescaleDB hypertable  
INSERT INTO sensor_data (SELECT * FROM old_data);  3. 查询hyper table
# Query hypertable like any SQL table  
SELECT device_id, AVG(temperature) from sensor_data  
WHERE temperature IS NOT NULL AND humidity > 0.5  
AND time > now() - interval '7 day'  
GROUP BY device_id;  4. 查询最近异常的数据
# Metrics about resource-constrained devices  
SELECT time, cpu, freemem, battery FROM devops  
WHERE device_id='foo'  
AND cpu > 0.7 AND freemem < 0.2  
ORDER BY time DESC  
LIMIT 100;  5. 计算最近7天,每小时的异常次数
# Calculate total errors by latest firmware versions  
# per hour over the last 7 days  
SELECT date_trunc('hour', time) as hour, firmware,  
COUNT(error_msg) as errno FROM data  
WHERE firmware > 50  
AND time > now() - interval '7 day'  
GROUP BY hour, firmware  
ORDER BY hour DESC, errno DESC;  6. 计算巴士的每小时平均速度
# Find average bus speed in last hour  
# for each NYC borough  
SELECT loc.region, AVG(bus.speed) FROM bus  
INNER JOIN loc ON (bus.bus_id = loc.bus_id)  
WHERE loc.city = 'nyc'  
AND bus.time > now() - interval '1 hour'  
GROUP BY loc.region;  7. 展示最近12小时,每小时的平均值
=#  SELECT date_trunc('hour', time) AS hour, AVG(weight)  FROM logs  WHERE device_type = 'pressure-sensor' AND customer_id = 440  AND time > now() - interval '12 hours'  GROUP BY hour;  hour               | AVG(weight)  
--------------------+--------------  2017-01-04 12:00   | 170.0  2017-01-04 13:00   | 174.2  2017-01-04 14:00   | 174.0  2017-01-04 15:00   | 178.6  2017-01-04 16:00   | 173.0  2017-01-04 17:00   | 169.9  2017-01-04 18:00   | 168.1  2017-01-04 19:00   | 170.2  2017-01-04 20:00   | 167.4  2017-01-04 21:00   | 168.6  8. 监控每分钟过载的设备数量
=#  SELECT date_trunc('minute', time) AS minute, COUNT(device_id)  FROM logs  WHERE cpu_level > 0.9 AND free_mem < 1024  AND time > now() - interval '24 hours'  GROUP BY minute  ORDER BY COUNT(device_id) DESC LIMIT 25;  minute             | heavy_load_devices  
--------------------+---------------------  2017-01-04 14:59   | 1653  2017-01-04 15:01   | 1650  2017-01-04 15:00   | 1605  2017-01-04 15:02   | 1594  2017-01-04 15:03   | 1594  2017-01-04 15:04   | 1561  2017-01-04 15:06   | 1499  2017-01-04 15:05   | 1460  2017-01-04 15:08   | 1459  9. 最近7天,按固件版本,输出每个固件版本的报错次数
=#  SELECT firmware_version, SUM(error_count) FROM logs  WHERE time > now() - interval '7 days'  GROUP BY firmware_version  ORDER BY SUM(error_count) DESC LIMIT 10;  firmware_version  | SUM(error_count)  
-------------------+-------------------  1.0.10            | 191  1.1.0             | 180  1.1.1             | 179  1.0.8             | 164  1.1.3             | 161  1.1.2             | 152  1.2.1             | 144  1.2.0             | 137  1.0.7             | 130  1.0.5             | 112  1.2.2             | 110  10. 某个范围,每小时,温度高于90度的设备数量。
=#  SELECT date_trunc('hour', time) AS hour, COUNT(logs.device_id)  FROM logs  JOIN devices ON logs.device_id = devices.id  WHERE logs.temperature > 90 AND devices.location = 'SITE-1'  GROUP BY hour;  hour               | COUNT(logs.device_id)  
--------------------+------------------------  2017-01-04 12:00   | 994  2017-01-04 13:00   | 905  2017-01-04 14:00   | 875  2017-01-04 15:00   | 910  2017-01-04 16:00   | 905  2017-01-04 17:00   | 840  2017-01-04 18:00   | 801  2017-01-04 19:00   | 813  2017-01-04 20:00   | 798  
  • 开源中间件
# TimescaleDBhttps://iothub.org.cn/docs/middleware/
https://iothub.org.cn/docs/middleware/timescale/timescale-summary/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/273444.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

denied: requested access to the resource is denied报错解决

Docker 镜像在文件中包含一组指令&#xff0c;可在 Docker 容器中执行代码。大多数情况下&#xff0c;在创建 docker 镜像之后&#xff0c;当尝试将镜像推送到远程仓库时&#xff0c;会发生这种类型的报错“Docker denied: requested access to the resource is denied” 由于错…

图论练习6

[NOIP2013]车站分级 Here 解题思路 由于起始点之间所选的站号&#xff0c;相互之间一定满足那么对于起始点间未选择的站号&#xff0c;一定满足选择的站号考虑用边来维护信息&#xff0c;表示的级别大于按题意&#xff0c;则车站会被分为几个联通块&#xff0c;且保证块内无环…

vue3+elementPlus:el-table-column表格列动态设置单元格颜色

:cell-style属性 //html<el-tableempty-text"暂无数据":data"datalist.table":max-height"height"row-key"id"border:cell-style"cellStyle"> <el-table>//js //动态设置单元格颜色 const cellStyle ({ row, c…

风车IM即时通讯系统APP源码DJ2403版完整苹果安卓教程

关于风车IM&#xff0c;你在互联网上能随便下载到了基本都是残缺品&#xff0c; 经过我们不懈努力最终提供性价比最高&#xff0c;最完美的版本&#xff0c; 懂货的朋友可以直接下载该版本使用&#xff0c;经过严格测试&#xff0c;该版本基本完美无缺。 1.宝塔环境如下: Ngin…

网络协议常见问题

网络协议常见问题 OSI&#xff08;Open Systems Interconnection&#xff09;模型OSI 封装 TCP/IP协议栈IP数据报的报头TCP头格式UDP头格式TCP (3-way shake)三次握手建立连接&#xff1a;为什么三次握手才可以初始化 Socket、序列号和窗口大小并建立 TCP 连接。每次建立TCP连接…

PyCharm无代码提示解决

PyCharm无代码提示解决方法 在使用PyCharm工具时&#xff0c;调用方法却无法进行提示&#xff0c;针对PyCharm无代码提示整理下解决方案 1、Python内置语法无智能提示 复现&#xff1a;我这里以urllib库读取网页内容为例&#xff0c;在通过urlopen(&#xff09;之后调用getur…

linux系统adb调试工具

adb的全称为Android Debug Bridge&#xff0c;就是起到调试桥的作用。通过adb可以在Eclipse中通过DDMS来调试Android程序&#xff0c;说白了就是调试工具。 adb的工作方式比较特殊&#xff0c;采用监听Socket TCP 5554等端口的方式让IDE和Qemu通讯&#xff0c;默认情况下adb会…

生活的色彩--爱摸鱼的美工(17)

题记 生活不如意事十之八九&#xff0c; 恶人成佛只需放下屠刀&#xff0c;善人想要成佛却要经理九九八十一难。而且历经磨难成佛的几率也很小&#xff0c;因为名额有限。 天地不仁以万物为刍狗&#xff01; 小美工记录生活&#xff0c;记录绘画演变过程的一天。 厨房 食…

基于uniapp cli项目开发的老项目,运行报错path.replace is not a function

项目&#xff1a;基于uniapp cli的微信小程序老项目 问题&#xff1a;git拉取代码&#xff0c;npm安装包时就报错&#xff1b; cnpm能安装成功包&#xff0c;运行报错 三种方法尝试解决&#xff1a; 更改代码&#xff0c;typeof pathstring的话&#xff0c;才走path.replace…

C++第一弹---C++入门(上)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 【C详解】 C入门 1、C关键字(C98) 2、命名空间 2.1、命名空间定义 2.2、命名空间使用 3、C输入&输出 4、缺省参数 4.1、缺省参数概念 4.2、缺省参…

laravel-admin 头部添加操作

新建html 样式及js namespace App\Admin\Extensions\Nav;class Links {public function __toString(){return <<<HTML<li><a href"" οnclick"js_method();return false;"><i class"fa fa-floppy-o"></i><s…

git分布式管理-头歌实验冲突处理、忽略文件

一、解决冲突 任务描述 在团队协作开发过程中&#xff0c;可能你和团队中的其他成员&#xff0c;都修改了某个文件的某一部分内容&#xff0c;且其他成员已将该修改推送到了远程仓库。这样当你需要合并他的代码的时候&#xff0c;可能就会在内容上出现冲突&#xff0c;这个时候…

Buran勒索病毒通过Microsoft Excel Web查询文件进行传播

Buran勒索病毒首次出现在2019年5月&#xff0c;是一款新型的基于RaaS模式进行传播的新型勒索病毒&#xff0c;在一个著名的俄罗斯论坛中进行销售&#xff0c;与其他基于RaaS勒索病毒(如GandCrab)获得30%-40%的收入不同&#xff0c;Buran勒索病毒的作者仅占感染产生的25%的收入,…

C++ 有边数限制的最短路 Bellman_ford算法(带负权边)

给定一个 n 个点 m 条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c; 边权可能为负数。 请你求出从 1 号点到 n 号点的最多经过 k 条边的最短距离&#xff0c;如果无法从 1 号点走到 n 号点&#xff0c;输出 impossible。 注意&#xff1a;图中可能 存在负权回路…

Python调用edge-tts实现在线文字转语音

edge-tts是一个 Python 模块&#xff0c;允许通过Python代码或命令的方式使用 Microsoft Edge 的在线文本转语音服务。 项目源码 GitHub - rany2/edge-tts: Use Microsoft Edges online text-to-speech service from Python WITHOUT needing Microsoft Edge or Windows or an…

精益生产与智能制造:未来制造业的蓝图

随着科技的飞速发展和全球竞争的加剧&#xff0c;制造业正面临着前所未有的挑战和机遇。为了适应这一变革&#xff0c;制造业正在寻求创新和转型&#xff0c;而精益生产和智能制造成为了未来的蓝图。 精益生产是一种以最大限度地提高效率和减少浪费为核心的生产方式。它起源于日…

企业微信变更主体对用户有影响吗?

企业微信变更主体有什么作用&#xff1f;现在很多公司都用企业微信来加客户&#xff0c;有时候辛辛苦苦积累了很多客户&#xff0c;但是公司却因为各种各样的原因需要注销&#xff0c;那么就需要通过企业微信变更主体的方法&#xff0c;把企业微信绑定的公司更改为最新的。企业…

为什么不用 index 做 key?

“在 Vue 中&#xff0c;我们在使用 v-for 渲染列表的时候&#xff0c;为什么要绑定一个 key&#xff1f;能不能用 index 做 key&#xff1f;” 在聊这个问题之前我们还得需要知道 Vue 是如何操作 DOM 结构的。 虚拟DOM 我们知道&#xff0c;Vue 不可以直接操作 DOM 结构&am…

一文了解原型和原型链

本文重点概念&#xff1a; 1、所有的对象都是new一个函数创建的 2、所有的函数都有一个属性prototype&#xff0c;称为函数原型 3、函数原型得到的这个对象都有一个属性constructor,指向该函数 4、所有的对象都有一个属性&#xff1a;隐式原型__proto__&#xff0c;隐式原型…

Django高级之-缓存

Django高级之-缓存 一 缓存介绍 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一次的的后台操作,都会消耗很多的服务端资源,所以必须使用缓存来减轻后端服务…