Hypertable Basics 超表基础

42 篇文章 9 订阅
42 篇文章 22 订阅

文章:https://docs.timescale.com/v0.9/using-timescaledb/hypertables

TimescaleDB中的Hypertable(超表)被设计为易于管理,并且可以向熟悉标准PostgreSQL表的用户预测行为。 沿着这些路线,在TimescaleDB中创建,更改或删除(超)表的SQL命令与PostgreSQL中的相同。 即使可改变的是由许多相互关联的“块”表组成,对于可改变的自动传播的命令改变为属于该可改变的所有块。

创建一个超表

创建超表有两个步骤:

1、创建一个标准表(PostgreSQL文档


2、然后,在这个新创建的表(API文档)上执行TimescaleDB create_hypertable命令。

提示:如果您需要将现有表中的数据迁移到可更改的表,请务必在调用函数时将migrate_data参数设置为true。 如果您希望更好地控制index的形成和hypertable的其他方面,请按照这些迁移说明进行操作

警告:使用migrate_data参数转换非空表可以将表锁定很长时间,具体取决于表中的数据量。

提示:create_hypertable函数中使用的'time'列支持时间戳,日期或整数类型,因此您可以使用一个不明确基于时间的参数,只要它可以递增即可。 例如,一个单调递增的id会起作用。

============================================================================

改变hypertable(超表)

可以针对hypertable(PostgreSQL文档)执行标准的ALTER TABLE命令。


然后,TimescaleDB将自动将这些模式更改传播到构成这个可改写的块的块。

警告:如果任何其他列的默认值设置为NULL,则更改表格架构非常有效。 如果默认值设置为非空值,则TimescaleDB将需要为属于该可改写值的所有行(属于所有块)填写此值。

============================================================================

删除hypertable(超表)

这只是标准的DROP TABLE命令,其中TimescaleDB将相应地删除属于hypertable的所有块。


============================================================================

最佳实践

TimescaleDB的用户通常有两个常见问题:

1、应该配置多少时间分区间隔?

2、应该使用空间分区吗?应该使用多少个空间分区?

时间间隔:TimescaleDB的当前版本不执行自适应时间间隔(尽管这在工作中)。 因此,用户必须通过设置chunk_time_interval(或使用默认值1个月)来创建超级可配置时对其进行配置。 用于新块的间隔可通过调用set_chunk_time_interval来更改。

选择时间间隔的关键属性是,属于最近时间间隔(或使用空间分区时的块)的块(包括索引)适合内存。 因此,我们通常建议设置间隔,以使这些块不超过主存储器的25%。

提示:确保您计划将所有活动的可调整内容放入主内存的25%,而不是每个可调整内容的25%。

要确定这一点,您需要对数据速率有一个大致的了解。 如果您每天大概写入2GB数据并拥有64GB内存,则将时间间隔设置为一周将会很好。 如果您每天在同一台机器上写入10GB,则将时间间隔设置为一天将是适当的。 如果批量加载数据,例如,您每周大容量加载70GB数据,并且数据与整个星期的记录相对应,则此间隔也可以保持。

虽然将块分成小块而非大块通常更安全,但设置间隔太小可能会导致很多块,这对应于某些类型查询的计划延迟增加。

提示:需要注意的是,总块大小实际上取决于基础数据大小和任何索引,因此如果大量使用昂贵的索引类型(例如某些PostGIS地理空间索引),可能需要小心。 在测试期间,您可能会通过块关系大小函数检查您的总块大小。

空间分区:使用额外的分区是一个非常特殊的用例。 大多数用户不需要使用它。

空间分区使用散列:每个不同的项目散列到N个存储桶之一。 请记住,我们已经使用(灵活)时间间隔来管理块大小; 空间分区的主要目的是使并行I / O达到相同的时间间隔。

并行I / O可以在两种情况下受益:(a)两个或更多并发查询应该能够并行读取不同的磁盘,或者(b)单个查询应该能够使用查询并行来并行读取多个磁盘。

注意,PostgreSQL 9.6(和10)中的查询并行化不支持并行查询不同的超表块;查询并行化仅适用于单个物理表(因此是单个块)。我们可能会为此添加自己的支持,但目前不支持。

因此,寻找并行I/O的用户有两种选择:

1、在多个物理磁盘上使用RAID设置,并将单个逻辑磁盘暴露到超表(即,通过单个表空间)。

2、对于每个物理磁盘,向数据库中添加一个单独的表空间。TimescaleDB允许您实际上将多个表空间添加到单个超表中(尽管在覆盖之下,每个基础块将由TimescaleDB映射到单个表空间/物理磁盘)。

我们建议在可能的情况下设置RAID,因为它支持上述两种形式的并行化(即,单独的磁盘查询、并行的多个磁盘的单个查询)。多表空间方法只支持前者。在RAID设置中,不需要空间分区。

也就是说,当使用空间分区时,我们建议每个磁盘使用1个空间分区。

TimescaleDB不会从大量的空间分区中受益(例如分区字段中期望的唯一项的数量)。 大量这样的分区导致较差的每分区负载均衡(使用散列将项目映射到分区),以及某些类型查询的计划延迟大大增加。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TimescaleDB是一个开源的时间序列数据库,它支持超表hypertables)的概念,这允许你将多个相关表合并到单个逻辑表中,并以更有效的方式存储和查询时间序列数据。 以下是创建超表的步骤: 1. 创建一个普通表,并指定时间戳列。例如: ``` CREATE TABLE mytable ( time TIMESTAMP NOT NULL, device_id TEXT NOT NULL, temperature DOUBLE PRECISION, humidity DOUBLE PRECISION, PRIMARY KEY (time, device_id) ); ``` 2. 在该表上创建一个超表,使用`create_hypertable`函数。例如: ``` SELECT create_hypertable('mytable', 'time'); ``` 这将创建一个名为`mytable`的超表,并将时间戳列`time`作为超表的时间维度。超表将自动创建适当的索引和分区策略,以便更有效地存储和查询数据。 3. 可选的,你可以使用`show_create_hypertable`函数来查看超表的详细信息。例如: ``` SELECT show_create_hypertable('mytable'); ``` 这将显示超表的DDL语句,包括使用的索引和分区策略。 现在,你可以将数据插入到超表中,如同插入到普通表中一样,例如: ``` INSERT INTO mytable (time, device_id, temperature, humidity) VALUES ('2022-02-28 12:00:00', 'device1', 25.5, 60.0); ``` 查询超表时,你可以使用与查询普通表相同的语法,例如: ``` SELECT * FROM mytable WHERE device_id = 'device1' AND time >= '2022-02-28 00:00:00' AND time < '2022-03-01 00:00:00'; ``` 这将返回`device1`设备在`2022-02-28`这一天的所有温度和湿度数据。使用超表可以大大提高时间序列数据的存储和查询效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值