时间系列数据存储在容器中,除非数据保持足够小可以存储在表的单个行中。时间系列存储在容器中时,数据会连续存储,因此数据检索所需的磁盘读取数最少。如果在插入时间系列数据之前未创建时间系列容器,那么将根据需要自动创建这些容器。可以通过控制存储时间系列数据的数据库空间并删除旧时间系列数据来管理存储。
容器将映射到数据库空间中的分区,分区是物理存储器(块)的一种逻辑分组。下面的插图显示了数据库中容器的体系结构。一个数据库通常包含多个数据库空间。一个数据库空间可以包含多个容器以及表和可用空间。一个容器可以包含一个或多个源(例如,电表)的数据。特定源的时间系列数据按时间戳记顺序存储在页面上。
图: 数据库中容器的缺省配置的体系结构数据库中容器的体系结构
向时间系列中插入数据,并且不指定容器名称时,数据库服务器将检查是否有一个或多个为该时间系列正确配置的容器。如果存在任何匹配的容器,那么具有最多可用空间的容器将分配给该时间系列。如果不存在任何匹配的容器,那么数据库服务器将在每个存储表的数据库空间内创建匹配的容器。例如,如果表不分段,并且因此存储在单个数据库空间中,那么将会创建一个容器。如果表分到三个数据库空间内,那么将创建三个容器。
数据库服务器自动创建的所有容器均属于缺省的容器池 autopool。容器池是一组容器。您可以创建一个或多个容器池以用于包含容器。可以将容器分配给容器池。或者,也可以创建自己的容器池策略函数。
在多个数据库空间中存储时间系列数据的策略取决于数据的分发方式、数据插入到相应容器的方式以及删除旧数据的方式。
在以下情况下,时间系列数据会存储在多个数据库空间中:
下表比较了不同的策略。
策略 | 数据分发方法 | 插入数据 | 按日期范围删除数据 |
---|---|---|---|
表在多个数据库空间之间进行分段,并且容器自动创建。 | 时间系列数据在表分段所在的相同数据库空间之间分发。 | 数据按循环顺序存储在容器中。 | 运行 TSContainerPurge 函数可在所有容器中按日期范围删除数据。 |
您在多个数据库空间中创建多个容器。 | 由您确定如何分发数据。可以按主键值分发时间系列数据。您可以为每个容器确定一组特定的主键值。 | 插入数据时,您为主键值指定相应的容器名称。 | 运行 TSContainerPurge 函数可在所有容器中按日期范围删除数据。 |
创建滚动窗口容器。 | 时间系列数据按日期时间间隔分发。每个日期时间间隔都存储在自己的分区中。分区存储在多个数据库空间中。 | 插入数据时,您指定滚动窗口容器的名称。该容器控制用于存储数据的数据库空间。 | 您配置自动清除策略以按日期范围删除数据,或手动销毁分区。 |
下图显示了多个数据库空间中的多个容器。时间系列数据按主键值分发。
图: 用于多个容器的数据库空间的体系结构
每个容器为一组特定的计量表标识存储所有日期的数据。每个数据库空间存储一个容器和其他表。 如果容器是自动创建的,那么每个数据库空间包含用于存储与该容器相同的主键值的表分段。
创建滚动窗口容器时,您指定存储数据所依据的时间间隔以及用于存储数据的数据库空间的列表。 滚动窗口容器按指定时间间隔在不同分区中存储时间系列数据。分区会按循环顺序存储在指定的数据库空间中。容器数据库空间存储有关哪个分区中有哪些数据的信息。下图显示了在四个数据库空间中存储数据的一个容器。 每个分区的时间间隔为一个月。
图: 用于滚动窗口容器的数据库空间的体系结构
在此图中,名为 dbs0 的数据库空间包含容器 Container1 和其他表。Container1 存储有关每个分区中数据的时间间隔以及每个分区位置的信息。名为 dbs1、dbs2 和 dbs3 的数据库空间将时间系列元素存储在分区和其他表中。每个分区为所有计量表标识存储一个月的数据。
通过使用分区,可轻松除去旧数据。可以将滚动窗口容器配置为在存储指定的数据量之后自动删除旧数据。您指定要在活动窗口和休眠窗口中保留的分区数。活动窗口包含可以将数据插入到的分区。休眠窗口包含不再需要查询但尚未准备好将其删除的分区。插入下一个时间间隔的数据时,活动窗口将在时间上向前推进。插入晚于最新分区的数据时,将添加新分区,并且活动窗口将向前推进。当活动窗口超出最大分区数时,最旧的分区将移至休眠窗口。当休眠窗口超出最大分区数时,最旧的分区将销毁。
下图显示了活动窗口和休眠窗口如何随时间变化而增长和移动。在本示例中,两个窗口的最大大小均为两个月。
图: 随时间变化而移动的活动窗口和休眠窗口的示例
此图显示了在插入每个月的数据时,这两个窗口如何增长和移动:
您可以在活动和休眠窗口之间移动分区,并更改这两个窗口的大小。