当前位置: 首页 > 编程笔记 >

postgresql数据库 timescaledb 时序库 把大数据量表转换为超表的问题

吕越彬
2023-03-14
本文向大家介绍postgresql数据库 timescaledb 时序库 把大数据量表转换为超表的问题,包括了postgresql数据库 timescaledb 时序库 把大数据量表转换为超表的问题的使用技巧和注意事项,需要的朋友参考一下

前言

这几天工作的时候发现在 timescaledb 时序库 中有部分大数据量的表不是超表,估计是当时建库的时候没有改 影响插入,查询效率 ,因此需要改成超表
因工作原因 部分内容做保密处理了

一 创建新表

首先因为在 timescaledb 时序库 中创建超表必须是要没有数据的表
因此第一步是 创建一张跟原表一模一样的表(表名后面加个_cs) 你可以直接copy建表语句,也可以直接用工具复制表结构

二 把新表改为超表

把新建的表改为超表,7天一分区

--我是7天一分区
SELECT create_hypertable('表名_cs', 'alarm_time', chunk_time_interval => INTERVAL '7 day');
-- 加个索引
CREATE INDEX "表名_cs_create_time_idx" ON "hrmw"."表名_cs" USING btree (
 "create_time" "code"."列名" DESC NULLS FIRST
);

三 插入数据

1.数据量不大的情况可以直接插入

INSERT into 表名_cs SELECT * from 表名;

2.如果数据量比较大 可以采取 一天一天 插入 或者一个月 或者几个月一起插入

INSERT into 表名_cs SELECT * from 表名 where alarm_time >= '2020-9-1';
INSERT into 表名_cs SELECT * from 表名 where alarm_time >= '2020-10-1' and alarm_time < '2020-11-1'  ;

3.运用函数(储存过程

对于表数据量太大,一天一天的插入的话 可以运用储存过程(postgresql 数据库叫函数)

下面是我写的函数。大家可以借鉴

CREATE 
	OR REPLACE PROCEDURE "hrmw"."sp_into_表名_pt" ( ) AS $BODY$ BEGIN
	-- 一般按照表名来建函数
	DECLARE --我声明的变量有点多 按实际的来
		target_text TEXT;
	sqltext TEXT;
	sqltext1 TEXT;
	sqltext2 TEXT;
	rd record;
	nloop INT;
	isexist TEXT;
	datestr TEXT;
	begindate TEXT;
	n INT;
	BEGIN
			--查询最早一天的时间
			sqltext := 'select to_char(min(alarm_time),''yyyy-mm-dd'') datestr from tb_hrmw_moni_target';    
		EXECUTE sqltext INTO begindate;
		n := date_part( 'day', now( ) - begindate :: DATE );
--enddate:=(to_char(now(),'yyyy-mm-dd'))::text;
		FOR nloop IN 0..n
		LOOP
		datestr := ( begindate :: DATE + nloop ) :: TEXT;
		sqltext2 := '
		insert into 表名_cs 
		select
		列名1,
		code,
		列名2,
		alarm_time,
		列名3,
		列名4
		from 表名
		where alarm_time >= ''' || datestr || ' 00:00:00''
		and alarm_time <= ''' || datestr || ' 23:59:59''
		'; 
		EXECUTE sqltext2;
		COMMIT;
		
	END loop;
RETURN;

END;

END $BODY$ LANGUAGE plpgsql

四 查看效果

模式 _timescaledb_internal下面的就是分区

到此这篇关于postgresql数据库 timescaledb 时序库 把大数据量表转换为超表的文章就介绍到这了,更多相关postgresql数据库 timescaledb 时序库内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!

 类似资料:
  • 本文向大家介绍postgresql 数据库 与TimescaleDB 时序库 join 在一起,包括了postgresql 数据库 与TimescaleDB 时序库 join 在一起的使用技巧和注意事项,需要的朋友参考一下 之前在CSDN阅读资料时,发现有人问怎么把 postgresql数据库 的表 跟TimescaleDB 时序库的表 join在一起,正好我在查询数据的时候遇到过这个问题 ,我说

  • 本文向大家介绍超大数据量存储常用数据库分表分库算法总结,包括了超大数据量存储常用数据库分表分库算法总结的使用技巧和注意事项,需要的朋友参考一下 当一个应用的数据量大的时候,我们用单表和单库来存储会严重影响操作速度,如mysql的myisam存储,我们经过测试,200w以下的时候,mysql的访问速度都很快,但是如果超过200w以上的数据,他的访问速度会急剧下降,影响到我们webapp的访问速度,而

  • 可以使用gettext翻译数据库表的内容吗? 例如,我有一些永远不会更改内容的数据库表,例如连接国家id(“fr”、“de”、…)的表有国家名称(“法国”、“德国”和……)国家名称用英语书写的地方。我可以添加额外的表列来提供不同语言的国家名称翻译,但我想知道,是否可以使用gettext来翻译国家名称。 如果有必要,我会使用php并在代码中用。

  • 问题内容: 在我的代码中,用户可以上传一个excel文档,希望其中包含电话联系人列表。作为开发人员,我应阅读excel文件,将其转换为dataTable并将其插入数据库。问题是某些客户拥有大量的联系人,例如说5000个和更多的联系人,而当我尝试将这种数据量插入数据库时​​,它崩溃了,并给了我一个超时异常。避免这种异常的最佳方法是什么?它们的任何代码都可以减少insert语句的时间,从而使用户不必等

  • 在实例详细信息页面中,点击数据库和表部分下的“查看全部”。“数据库和表”页面会以列表显示服务器中的数据库和表和它们的大小。该列表按大小排序。点击左侧窗格中的实例以跳转到其数据库和表页面。

  • 我正在创建一个JavaFX应用程序,我已经很好地连接到了数据库。然而,当我从表中获取数据时,我得到了一个错误 组织。h2.jdbc。JdbcSQLException:未找到表“touch”;SQL语句:从讲座[42102-192]中选择名称 我100%确定我连接到数据库并且表肯定在那里,对为什么会这样有任何建议吗? hear是我的连接代码和我正在运行的代码,以便您可以看到 和正在运行的查询