由于blog各种垃圾评论太多,而且本人审核评论周期较长,所以懒得管理评论了,就把评论功能关闭,有问题可以直接qq骚扰我

TimescaleDB时序数据库超表维护

大数据 西门飞冰 2735℃

TimescaleDB和超表 介绍

Timescaledb是基于PostgreSQL数据库的时序数据库,提供了存储和管理时间序列数据的功能:

超表(Hypertable)是 TimescaleDB 中的核心概念,它实际上就是一张表,但是具有以下特点:

按时间自动分割 into 多个分区(chunks)。 每个分区是一个普通的 PostgreSQL 表,存储不同时间范围的数据。 超表提供统一的视图,可以轻松的查询超表中的所有数据。 分区可以根据需要自动增长,或者手动增加。 老的数据分区可以自动删除或者合并,方便数据的维护。

所以超表给我们带来的主要好处是:

存储大量时间序列数据,超出单个 PostgreSQL 表的限制。 按时间自动管理和删除老的数据。 提供整体的视图,可以轻松的查询超表中的所有数据,不用关心底层的分区表。 优化的存储格式可以大大提高查询效率。

总结来说,TimescaleDB 通过超表和其他时间序列优化功能,使 PostgreSQL 成为一个功能强大的时间序列数据库,可以方便的存储和管理大量的时间序列数据。

创建超表

创建超表之前需要在相应数据库启用timescaledb 插件:

postgres=# CREATE EXTENSION IF NOT EXISTS timescaledb;

启用之后通过如下命令验证:

postgres=# \dx 
                                      List of installed extensions
    Name     | Version |   Schema   |                            Description                            
-------------+---------+------------+-------------------------------------------------------------------
 plpgsql     | 1.0     | pg_catalog | PL/pgSQL procedural language
 timescaledb | 2.9.1   | public     | Enables scalable inserts and complex queries for time-series data

1、创建常规数据表

CREATE TABLE conditions (
   time        TIMESTAMPTZ       NOT NULL,
   location    TEXT              NOT NULL,
   temperature DOUBLE PRECISION  NULL,
   humidity    DOUBLE PRECISION  NULL
);

2、常规数据表转换成超表

SELECT create_hypertable('conditions', 'time');

第一个参数是表名,第二个参数是用于分区的时间戳数据的列名

3、默认时间间隔为 7 天。修改时间间隔为 1 天

SELECT set_chunk_time_interval('conditions', INTERVAL '1 days');

数据写入:

insert
	into
	conditions(time,
	location,
	temperature,
	humidity)
values ('2023-04-07 00:00:00',
'beijing',
20,
40),
('2023-04-08 12:00:00',
'shanghai',
25,
50);

查询超表chunk

select show_chunks('conditions');

显示一天以前的数据块

select show_chunks('conditions', older_than => interval '1 days');

显示4月8日前的数据块

select show_chunks('conditions', older_than => DATE '2023-04-08');

将非空的数据表转换为超表:

SELECT create_hypertable('conditions', 'time', migrate_data=>true);

migrate_data=>true:将数据先迁移出去变成一个空表,然后创建成超表,再把数据迁移回来

数据压缩

1、在超表上启用压缩

ALTER TABLE conditions SET (
  timescaledb.compress,
  timescaledb.compress_segmentby = 'time'
);

2、创建压缩策略:添加压缩策略来压缩超过3天的块

SELECT add_compression_policy('conditions', INTERVAL '3 days');

chunks删除

(1)手动删除

select drop_chunks('conditions', older_than=> DATE '2023-04-08');

当且仅当块的时间范围完全落在指定的时间戳之前(或之后)时,块才会被删除,因此其余数据仍然可能包含在指定的时间戳之前(或之后)的时间戳

(2)创建自动数据保留策略

案例场景:删除超过7天的原始数据

select add_retention_policy('conditions',INTERVAL '7 days');

查看chunks大小

查看一个超表的大小

select hypertable_size('conditions');		// 默认是字节大小

select pg_size_pretty(hypertable_size('conditions'));		// 进行单位转换后的大小

查看所有超表的大小

select hypertable_name, hypertable_size(format('%I.%I',hypertable_schema,hypertable_name)::regclass) from timescaledb_information.hypertables h ;

查看一个超表的详细大小:获取关于超表使用的磁盘空间相信信息,返回表本身的大小信息,表上的任何索引、任何toast tables以及所有toast tables的信息

select * from hypertable_detailed_size('conditions');

查看超表上的索引大小:

select pg_size_pretty(hypertable_index_size('conditions_time_idx'));		// 注意这里传入的是索引名称

查看chunk的详细信息

select * from chunks_detailed_size('conditions') order by chunk_name;

 

转载请注明:西门飞冰的博客 » TimescaleDB时序数据库超表维护

喜欢 (3)or分享 (0)