在 Timescaledb 中创建一个包含两列的索引的正确方法

Correct way to create one index with two columns in Timescaledb

我使用名为 Timescaledb.i 的 porstgreSQL 扩展,有一个名为 timestampdb 的 table。我想问一下这是否是创建一个包含两列的索引的正确方法(timestamp1,id13 ). 我使用的一些查询如下所示:

select * from timestampdb where timestamp1 >='2020-01-01 00:05:00' and timestamp1<='2020-01-02 00:05:00' and id13>'5',
select date_trunc('hour',timestamp1) as hour,avg(id13) from timestampdb where timestamp1 >='2020-01-01 00:05:00' and timestamp1<='2020-01-02 00:05:00' group by hour order by hour ,
select date_trunc('hour',timestamp1) as hour,max(id13) from timestampdb where timestamp1<='2020-01-01 00:05:00' group by hour order by hour desc limit 5

创建 table 后,我这样做:

create_hypertable("timestampdb",timestamp1) and then CREATE INDEX ON timestampdb (timestamp1,id13)

这是正确的方法吗?这会创建一个包含两列的索引吗?或者在 timestamp1 中创建一个索引,在 (timestamp1,id13)

中创建一个索引

是的,这是正确的方法。提供的调用实际上将创建一个与这两列相结合的索引。您要确保主导索引列(即第一个)是时间列。它在你的代码中。这样 tsdb 查询仍然会按时间首先找到您的数据(这对于大型数据集非常重要)。您的查询也与该索引匹配:它们主要基于时间范围进行搜索。

您可能想检查 postgres 执行查询的方式,方法是执行 解释分析; 或者使用 pgadmin 并单击“解释”按钮。 通过这种方式,您可以确保您的 Indizes 被命中,以及 postgres 是否有足够的堆缓冲区来缓存 tsdb table 页面或需要从磁盘读取(这实际上慢了 1000 到 10000 倍)。

我总觉得这些资源很有帮助: TSDB YT频道:https://youtube.com/c/TimescaleDB TSDB Slack 频道:https://slack.timescale.com/