【发布时间】:2020-03-11 02:31:36
【问题描述】:
我有几个包含大量 Null 的大型时间序列表(每个表最多可能有 300 列),例如:
时间序列表
time | a | b | c | d
--------------------+---------+----------+---------+---------
2016-05-15 00:08:22 | | | |
2016-05-15 13:50:56 | | | 26.8301 |
2016-05-15 01:41:58 | | | |
2016-05-15 00:01:37 | | | |
2016-05-15 01:45:18 | | | |
2016-05-15 13:45:32 | | | 26.9688 |
2016-05-15 00:01:48 | | | |
2016-05-15 13:47:56 | | | | 27.1269
2016-05-15 00:01:22 | | | |
2016-05-15 13:35:36 | 26.7441 | 29.8398 | | 26.9981
2016-05-15 00:08:53 | | | |
2016-05-15 00:08:30 | | | |
2016-05-15 13:14:59 | | | |
2016-05-15 13:33:36 | 27.4277 | 29.7695 | |
2016-05-15 13:36:36 | 27.4688 | 29.6836 | |
2016-05-15 13:37:36 | 27.1016 | 29.8516 | |
我想优化查询以在每列中搜索第一个和最后一个值,即:
select MIN(time), MAX(time) from TS where a is not null
(这些查询可能会运行几分钟)
我计划创建一个包含列名并指向第一个和最后一个时间戳的元数据表:
元数据表
col_name | first_time | last_time
---------+---------------------+--------------------
a | 2016-05-15 13:35:36 | 2016-05-15 13:37:36
b | 2016-05-15 13:35:36 | 2016-05-15 13:37:36
c | 2016-05-15 13:50:56 | 2016-05-15 13:45:32
d | 2016-05-15 13:47:56 | 2016-05-15 13:35:36
这样在查询期间不会发生空搜索,我只会访问第一个和最后一个时间戳中的值。
但我想避免每次修改时间序列数据时都需要更新元数据表。相反,我想创建一个通用触发器函数,它将更新每个插入、更新或删除到时间序列表的元数据表的 first_time 和 last_time 列。触发器函数应该将元数据表中的现有时间戳与插入/删除的行进行比较。
是否可以创建一个不包含时间序列表的确切列名的通用触发器函数?
谢谢
【问题讨论】:
-
不如尝试在
(a asc, time asc)和(a asc, time desc)上放置索引(b、c和d也是如此)。如果您愿意,可以选择“元数据”视图。最好尽量避免造成冗余。 -
您指的是会定期刷新的“物化”视图吗?我在标准视图中看不到任何优化......
-
没有。只是一个“正常”的观点。优化是索引。
-
我一开始没有提到,但是我在 TS 表中最多可以有 300 列。我怀疑拥有 300 个索引会比触发函数更影响插入性能....
-
我还希望索引会比触发器慢,因为触发器只需要在插入新的最小值或最大值时更新一行。虽然需要为插入的每个值更新索引。顺便说一句,您可能很想在触发器中编写循环所有列的动态代码,但根据我的经验,最好编写一个脚本,为每列生成带有特定代码的触发器。
标签: sql postgresql query-optimization query-performance timescaledb