Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何创建在TimescaleDB中限制行的计划用户定义的操作?

如何创建在TimescaleDB中限制行的计划用户定义的操作?
EN

Stack Overflow用户
提问于 2022-07-07 02:49:26
回答 1查看 79关注 0票数 2

我在TimescaleDB中监视、收集和存储不同组织的事件数据。

我有一个带有一个数据库的TimescaleDB。每个组织在数据库中都有自己的模式。每个模式有两个表:一个设备表和一个事件表。

设备表存储有关给定组织的设备的信息,而事件表是存储从不同设备收集的所有事件的时间序列表。事件表具有指向设备表的列(外键)。

这就是我的数据库的结构方式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Servers (1)
  ▼ TimescaleDB Cloud
    ▼  Databases (1)
      ▼  myTimescaleDB
        ▼ Schemas (12)organization_1 (12)Tables (2)
              ▼ device
                ▼ Columns (3)
                    device_id
                    device_name
                    device_type
              ▼ event
                ▼ Columns (5)
                    event_id
                    time
                    device_id (fk)
                    event_source
                    event_type
          ▼ organization_2 (12)Tables (2)
              ▼ device
                ▼ Columns (3)
                    device_id
                    device_name
                    device_type
              ▼ event
                ▼ Columns (5)
                    event_id
                    time
                    device_id (fk)
                    event_source
                    event_type

我想要创建一个预定的用户定义的操作,基本上确保每个设备最多只有10.000个事件。因此,假设每5分钟,用户定义的操作应该计算每个模式中每个设备的事件数。任何有超过10.000个事件的设备都应该被裁剪为只有10.000。不过,我们总想把那些旧的事情整理一下。我该怎么做?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-07 12:12:23

你的设备每X秒发送一次数据吗?因为如果有这样的情况,也可以创建保留策略。假设每个设备每5秒接收一次新事件,所以每分钟有12次,(12 * 60 * 24) =每天17280次。所以,17280中的10k大约是一天中的58%。

您也可以做一些数学,以获得一些小时,并使用保留策略删除其余的。

这将是采用保留政策,这最终是背景工作,做的正是删除。唯一的区别是,它们的效率要高得多,因为它们完全放弃了块。如果不是这样的话,您需要在这里请求帮助时使用自定义后台作业。

要构建适当的场景,您可以尝试构建一个查询来验证您想要的内容。下面是一个使用窗口函数获取适当记录的片段:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
WITH summary AS (
    SELECT time,
           device,
           ROW_NUMBER() OVER(PARTITION BY device
                                 ORDER BY time DESC ) AS rank
      FROM conditions )
 SELECT *
   FROM summary
 WHERE rank = 10000;

它会返回如下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
┌────────────────────────┬────────┬───────┐
│          time          │ device │ rank  │
├────────────────────────┼────────┼───────┤
│ 2000-01-07 21:17:05+00010000 │
│ 2000-01-04 10:56:19+00110000 │
│ 2000-01-04 11:37:45+00210000 │
│ 2000-01-04 11:53:32+00310000 │
│ 2000-01-04 11:42:57+00410000 │
│ 2000-01-04 10:13:28+00510000 │
│ 2000-01-04 11:30:52+00610000 │
│ 2000-01-04 11:38:55+00710000 │
│ 2000-01-04 11:46:30+00810000

现在只需要将查询与delete子句结合起来:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
WITH summary AS (
    SELECT time,
           device,
           ROW_NUMBER() OVER(PARTITION BY device
                                 ORDER BY time DESC ) AS rank
      FROM conditions )
 DELETE FROM conditions USING summary
   WHERE summary.rank = 10000 and conditions.time < summary.time and summary.device = conditions.device;

确认它如你所期望的那样有效:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select device, count(1) from conditions group by 1;
┌────────┬───────┐
│ device │ count │
├────────┼───────┤
│      010000 │
│      110000 │
│      210000 │
│      310000 │
│      410000 │
│      510000 │
│      610000

您可以将它封装到后台函数中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE OR REPLACE PROCEDURE limit_devices_data(job_id int, config jsonb) LANGUAGE PLPGSQL AS
$$
BEGIN
  RAISE NOTICE 'DELETING in the job % with config %', job_id, config;
   WITH summary AS (
    SELECT time,
           device,
           ROW_NUMBER() OVER(PARTITION BY device
                                 ORDER BY time DESC ) AS rank
      FROM conditions )
 DELETE FROM conditions USING summary
   WHERE summary.rank = 10000 and conditions.time < summary.time and summary.device = conditions.device;
  COMMIT;
END
$$;

并将作业添加到每5分钟运行一次,或者根据您的需要:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT add_job('limit_devices_data','5 minutes', initial_start => now() + INTERVAL '5 seconds');

如果您有太多的数据,可能需要增加max_runtime:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT alter_job(job_id, max_runtime =>  INTERVAL '1 minute');

由于在不同的模式下有几个表,所以我建议您查看一下执行结合格式来迭代几个表。可以使用information.hypertables视图查询超表名称。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72896482

复制
相关文章
linux 中的用户名如何定义
linux 用户名建议符合[a-z_][a-z0-9_-]*[$]正则表达式,并且长度不超过 32 位
zero000
2022/02/08
5.8K0
linux 中的用户名如何定义
dplyr中的行操作
在tidyverse中,整洁数据一般都是每一行是一个观测,每一列是一个变量,基本上所有操作都是基于整洁的数据进行的,都是对某列做什么操作。但有时候我们也需要对某行做一些操作,dplyr中现在提供了rowwise()函数快速执行对行的操作。
医学和生信笔记
2022/11/15
1.3K0
linux如何限制用户权限
具体开展的方法: 1. 修改代码配置,将log输出到一个单独的目录:/search/odin/flxlog/swc.log 2. 新建一个账户flxlog,默认目录为log目录:useradd -d /search/odin/flxlog/swc.log flxlog 3. 创建flxlog密码为flxlog:passwd flxlog。 4. 修改/search/odin/flxlog/文件夹及文件的用户和用户组:chown -R flxlog:flxlog /search/odin/flxlog/ 5. 修改泛灵犀代码目录的权限为root账号读写、其他账号不能查看: chown -R root:root /search/odin/test/test/ chmod 700 swc_15001/ 6. 切换到flxlog用户下,验证下结果:
软测小生
2019/07/05
9.9K0
linux如何限制用户权限
Discourse 如何限制注册用户的密码长度
为了更好的交互,我们建议登录用户的密码设置为 8 位,管理员的密码可以考虑设置为 10 位,或者都设置为 8 位。
HoneyMoose
2020/05/23
1.4K0
Discourse 如何限制注册用户的密码长度
CentOS 7 中httpd服务的用户限制详解
Apache HTTP Server 之所以受到众多企业的青睐,得益于其代码开源、跨平台、功能模块haul、可灵活定制等诸多优点,其不仅性能稳定,在安全性方面的表现也十分出色。
星哥玩云
2022/07/28
7690
CentOS 7 中httpd服务的用户限制详解
如何构建在 Docker 容器中运行命令?
Docker 是一种开源的容器化平台,它可以让开发者打包应用程序及其所有依赖项,并将其部署到任何支持 Docker 的环境中。Docker 容器提供了一种轻量级、可移植、自包含的方式来运行应用程序。本文将详细介绍如何构建在 Docker 容器中运行命令的步骤和技巧。
网络技术联盟站
2023/07/13
2910
如何构建在 Docker 容器中运行命令?
自定义注解妙用,一行代码搞定用户操作日志记录
1.简介 在使用spring完成项目的时候需要完成记录日志,开始以为Spring 的AOP功能,就可以轻松解决,半个小时都不用,可是经过一番了解过后,发现一般的日志记录,只能记录一些简单的操作,例如表名、表名称等记录不到。 这个时侯就用到了自定义注解,把想要记录的内容放在注解中,通过切入点来获取到注解参数,然后将参数插入数据库记录 2.Spring AOP 2.1.关于Spring AOP的一些术语 切面(Aspect):在Spring AOP中,切面可以使用通用类或者在普通类中以@Aspect 注解(@A
程序猿DD
2022/03/16
7880
Ubuntu操作系统中如何列出用户
大家好!我很高兴能为您带来这篇客座博文,今天我们将深入探讨在Ubuntu操作系统中如何列出用户。了解系统中的用户是网络管理的重要一环。我们将为您提供一个完整的教程,包含5个与此相关的关键要点,每个要点都有详细的示例和用例。
用户10665603
2023/07/18
5.4K0
Java 中如何限制方法的返回时间
可以使用 JDK 中的 ExecutorService 方法来对调用的方法进行处理。
HoneyMoose
2023/02/10
3.1K0
Java 中如何限制方法的返回时间
如何定义和统计用户的登录次数?
大家好,我是姬小光,欢迎来到我的专栏!本期我们来聊聊互联网产品的登录是怎么回事儿,以及如何合理地定义用户的登录次数。
姬小光
2020/03/09
4.4K0
如何定义和统计用户的登录次数?
mysql中的数据库对用户权限做限制
mysql中限定用户对数据库的权限 默认的MySQL安装之后根用户是没有密码的 先用根用户进入: # mysql -u root 执行: mysql> GRANT ALL PRIVILEGES ON *.* TO root@localhost IDENTIFIED BY “123456”; 用的是123456做为root用户的密码,我这里是做个例子,要是用123456做密码 那还不象不设置密码了:)
全栈程序员站长
2021/07/23
4K0
限制 SQL 返回行
您可以通过特定的行数或行的百分比来限制从 SQL 查询返回的行。在某些情况下,您可能需要在返回的行数受到限制之前对查询结果进行排序。
Yunjie Ge
2023/09/01
2070
限制 SQL 返回行
如何增加Linux中的打开文件数限制
在Linux中,您可以更改打开文件的最大数量。您可以使用ulimit命令修改此数字。它授予您控制shell启动的资源或由其启动的进程的能力。
胡齐
2019/09/23
7.6K0
Python中的用户定义异常与NZEC错误
当代码出错时,Python会引发错误和异常,这可能导致程序突然停止。Python还通过try-except提供了异常处理方法。一些最常见的标准异常包括IndexError,ImportError,IOError,ZeroDivisionError,TypeError和FileNotFoundError。用户可以使用异常类创建自己的错误。
用户7466307
2020/07/09
1.6K0
Python中的用户定义异常与NZEC错误
当代码出错时,Python会引发错误和异常,这可能导致程序突然停止。Python还通过try-except提供了异常处理方法。一些最常见的标准异常包括IndexError,ImportError,IOError,ZeroDivisionError,TypeError和FileNotFoundError。用户可以使用异常类创建自己的错误。
用户8460142
2023/07/07
1690
Python中的用户定义异常与NZEC错误
Python中的用户定义异常与NZEC错误
当代码出错时,Python会引发错误和异常,这可能导致程序突然停止。Python还通过try-except提供了异常处理方法。一些最常见的标准异常包括IndexError,ImportError,IOError,ZeroDivisionError,TypeError和FileNotFoundError。用户可以使用异常类创建自己的错误。
PHP开发工程师
2021/04/21
1.6K0
将MySQL复制限制为基于行的事件
在MySQL 8.0.18上进行的后续工作中,我们引入了对从服务器的回放线程进行权限检查功能,在本文中,我们将介绍一项新功能,可以进一步提高安全复制数据的能力,用户可以将复制流限制为仅基于行的事件。
MySQLSE
2020/09/28
9670
将MySQL复制限制为基于行的事件
备份和恢复 timescaledb 的超级表 (hypertables)
下面是使用 PostgreSQL 内置的工具 pg_dump 和 psql 对超级表 conditions 进行备份和恢复的步骤。
beginor
2020/08/10
2.1K0
在 NGINX 中根据用户真实 IP 进行限制
需要根据用户的真实 IP 进行限制, 但是 NGINX 前边还有个 F5, 导致 deny 指令不生效.
东风微鸣
2022/04/22
2.8K0
点击加载更多

相似问题

如何限制用户计划/角色的使用

35

如何限制某些行的操作?

40

TimeScaleDB物化行太大

11

如何创建在应用程序中限制用户存储的解决方案?

519

Spring Cloud Gateway中基于用户计划的速率限制

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文