前言
这几天工作的时候发现时标db时间序列数据库中有些数据量大的表不是超级表。估计当时建数据库的时候插入和查询效率都没有受到影响,所以需要改成超级表
由于工作原因,部分内容被保密
1.创建新表格
首先,因为在timescaledb时间序列库中创建的超级表必须是没有数据的表
因此,第一步是创建一个与原始表完全相同的表(在表名后添加a _cs)。您可以直接复制表构建语句,也可以使用工具直接复制表结构
第二,将新表改为超级表
将新创建的表更改为超级表,并每7天对其进行一次分区
-我是7天组的
SELECT create _ hypertable(' table name _ cs ',' alarm _ time ',chunk _ time _ interval=interval ' 7 day ');
-添加索引
“CREATE INDEX”表名_ cs _ CREATE _ time _ idx“ON”hrmw。表名_cs' USING btree(
Create_time' 'code . '列名' DESC第一空'
);
3.插入数据
1.如果数据不大,可以直接插入
1从表名插入表名_ cs SELECT *;
2.如果数据量比较大,可以逐日插入,也可以一个月或者几个月一起插入
从表名插入表名_cs SELECT *其中alarm _ time=年9月1日';从表名插入表名_cs SELECT *其中alarm _ time=' 2020-10-1 '和alarm _ time ' 2020-11-1 ';
3.使用函数(存储过程)
对于大量的表数据,如果日复一日地插入,可以使用存储过程(postgresql数据库称为函数)
以下是我的唐山快照优化功能。你可以从中学习
创造
或替换程序' hrmw '。sp _ into _ table name _ pt '()$ AS $ BOdy $ BEgin
-一般根据表名来构建函数
声明——我声明的变量更现实一点
target _ text TEXT
sqltext TEXT
sqltext1 TEXT
sqltext2 TEXT
rd记录;
nloop INT
isexist TEXT
datestr TEXT
begindate TEXT
n INT
开始
-查询最早一天的时间
sqltext :='从tb_hrmw_moni_target选择to_char(min(alarm_time),' ' ' yyyy-mm-DD ' ')date str ';
将sqltext执行到开始日期;
n :=date_part('day ',now()-begin DATE : DATE);
- enddate:=(to_char(now(),' yyyy-mm-DD ')): text;
用于0中的nloop.n
环
DATE str :=(begin DATE : DATE nloop): TExT;
sqltext2 :='
插入表名_cs
选择
列名1,
代码,
列名2,
闹钟时间,
列名3,
列名4
从表名
其中alarm _ time=' ' ' | | datestr | | ' 00:00:00 ' '
和alarm _ time=' ' ' | | datestr | | ' 23:59:59 ' '