• 售前

  • 售后

热门帖子
入门百科

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

[复制链接]
天一教育培训寐 显示全部楼层 发表于 2021-8-14 15:08:37 |阅读模式 打印 上一主题 下一主题
前言


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

首先因为在 timescaledb 时序库 中创建超表必须是要没有数据的表
因此第一步是 创建一张跟原表千篇一律的表(表名背面加个_cs) 你可以直接copy建表语句,也可以直接用工具复制表布局
二 把新表改为超表

把新建的表改为超表,7天一分区
  1. --我是7天一分区
  2. SELECT create_hypertable('表名_cs', 'alarm_time', chunk_time_interval => INTERVAL '7 day');
  3. -- 加个索引
  4. CREATE INDEX "表名_cs_create_time_idx" ON "hrmw"."表名_cs" USING btree (
  5. "create_time" "code"."列名" DESC NULLS FIRST
  6. );
复制代码
三 插入数据

1.数据量不大的情况可以直接插入
  1. INSERT into 表名_cs SELECT * from 表名;
复制代码
2.假如数据量比力大 可以采取 一天一天 插入 大概一个月 大概几个月一起插入
  1. INSERT into 表名_cs SELECT * from 表名 where alarm_time >= '2020-9-1';
  2. INSERT into 表名_cs SELECT * from 表名 where alarm_time >= '2020-10-1' and alarm_time < '2020-11-1'  ;
复制代码
3.运用函数(储存过程)
对于表数据量太大,一天一天的插入的话 可以运用储存过程(postgresql 数据库叫函数)
下面是我写的函数。各人可以鉴戒
  1. CREATE
  2.         OR REPLACE PROCEDURE "hrmw"."sp_into_表名_pt" ( ) AS $BODY$ BEGIN
  3.         -- 一般按照表名来建函数
  4.         DECLARE --我声明的变量有点多 按实际的来
  5.                 target_text TEXT;
  6.         sqltext TEXT;
  7.         sqltext1 TEXT;
  8.         sqltext2 TEXT;
  9.         rd record;
  10.         nloop INT;
  11.         isexist TEXT;
  12.         datestr TEXT;
  13.         begindate TEXT;
  14.         n INT;
  15.         BEGIN
  16.                         --查询最早一天的时间
  17.                         sqltext := 'select to_char(min(alarm_time),''yyyy-mm-dd'') datestr from tb_hrmw_moni_target';   
  18.                 EXECUTE sqltext INTO begindate;
  19.                 n := date_part( 'day', now( ) - begindate :: DATE );
  20. --enddate:=(to_char(now(),'yyyy-mm-dd'))::text;
  21.                 FOR nloop IN 0..n
  22.                 LOOP
  23.                 datestr := ( begindate :: DATE + nloop ) :: TEXT;
  24.                 sqltext2 := '
  25.                 insert into 表名_cs
  26.                 select
  27.                 列名1,
  28.                 code,
  29.                 列名2,
  30.                 alarm_time,
  31.                 列名3,
  32.                 列名4
  33.                 from 表名
  34.                 where alarm_time >= ''' || datestr || ' 00:00:00''
  35.                 and alarm_time <= ''' || datestr || ' 23:59:59''
  36.                 ';
  37.                 EXECUTE sqltext2;
  38.                 COMMIT;
  39.                
  40.         END loop;
  41. RETURN;
  42. END;
  43. END $BODY$ LANGUAGE plpgsql
复制代码
四 查察结果

模式 _timescaledb_internal下面的就是分区

到此这篇关于postgresql数据库 timescaledb 时序库 把大数据量表转换为超表的文章就先容到这了,更多相干postgresql数据库 timescaledb 时序库内容请搜刮草根技能分享从前的文章或继续浏览下面的相干文章盼望各人以后多多支持草根技能分享!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作