服务器监测-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.数据量不大的状况能够直接刺进

1INSERT 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

END loop;RETURN;

END;

END $BODY$ LANGUAGE plpgsql

四 查看作用

形式 _timescaledb_internal下面的就是分区