【问题标题】:Best way to join different continuos views in TimescaleDB在 TimescaleDB 中加入不同连续视图的最佳方式
【发布时间】:2021-11-26 21:29:33
【问题描述】:

这是一个安装了 Timescale 和 PostGIS 的 Postgres 数据库。

有 3 个 Hypertables,其中包含有关船舶状态的不同信息。 位置信息、航次信息、船舶详细信息。 示例:

CREATE TABLE position(
    imo         int                    NOT NULL,
    "timeReceived" TIMESTAMPTZ            NOT NULL,
    location    geography              NOT NULL,
    speed       DOUBLE PRECISION  NULL
);

SELECT create_hypertable('position', 'timeReceived');

CREATE TABLE voyage(
    imo         int                    NOT NULL,
    "timeReceived"        TIMESTAMPTZ            NOT NULL,
    destination text   NOT NULL
);

SELECT create_hypertable('voyage', 'timeReceived');


CREATE TABLE details (
    imo         int                    NOT NULL,
    "timeReceived" TIMESTAMPTZ            NOT NULL,
    draught     double precision       NULL
);

SELECT create_hypertable('details ', 'timeReceived');

这 3 个表总共有大约 40 列。 在我最近更新的表上每天更新 1000 万行,在更新最少的 2 个表上更新 100 万行。目前它才刚刚开始,所以最大的表上大约有 1.5 亿行。

在这些超表中的每一个上都有一个每小时更新的连续聚合。 示例:

CREATE materialized VIEW position_hourly WITH (timescaledb.continuous)
AS      SELECT
        time_bucket('1 hour', "timeReceived"),
        imo,
        last("timeReceived", "timeReceived") "timeReceived",
        last(src, "timeReceived") src,
        last("position","timeReceived")::geography "position"
    from position s_position
    group by imo, time_bucket('1 hour', "timeReceived")
    WITH NO DATA;

SELECT add_continuous_aggregate_policy('position_hourly',
  start_offset => INTERVAL '1 year',
  end_offset => INTERVAL '1 hour',
  schedule_interval => INTERVAL '3 hours');

最后,我想创建一个视图/表,其中包含来自 1 个表中所有这些来源的所有信息。 我尝试了什么:

create materialized view all_data as
SELECT *
FROM position_hourly ph 
LEFT JOIN LATERAL (
    SELECT ---just example columns
         destination, 
         vh."timeReceived" voyage_timereceived
    FROM voyage_hourly vh
    WHERE ph.imo = vh.imo 
    AND ph."time_bucket" >= vh."time_bucket"
    ORDER BY  vh."time_bucket" DESC
    LIMIT 1
    ) vh ON TRUE
LEFT JOIN LATERAL (
    SELECT ---just example columns
          draught, 
          vvh."timeReceived" vessel_timereceived
    FROM vessel_hourly vvh
    WHERE ph.imo = vvh.imo 
    AND ph."time_bucket" >= vvh."time_bucket"
    ORDER BY  vvh."time_bucket" DESC
    LIMIT 1
    ) vvh ON TRUE

(请注意,由于额外的列,查询要大得多,但逻辑是一样的)

我可以编写一个查询并在其上使用 limit 100 子句对其进行预览,但是当它尝试实现视图时需要 5 个多小时才能完成。 此视图应每小时更新一次。

如何优化我的查询,使其加载速度更快,即。 10分钟内? 我应该考虑对我的设置进行一些更改吗?

谢谢

【问题讨论】:

    标签: sql database postgresql timescaledb


    【解决方案1】:

    一些想法:

    1. 您是否启用了压缩?或许您还可以按imo 列进行分段并获得一些良好的压缩级别,而且它还可以更轻松地获得仅查找具有相同分段的块的结果。
    2. 您能否使超表稍微精简一些并将其中一些额外的列移到辅助表中?也许您不会一直查询所有数据,这样可以更轻松地只获取您需要的数据。
    3. 能否将LEFT JOIN LATERAL 移至 CTE?
    4. 您是否尝试过混合运行批量插入然后refresh_continuous_aggregate?也许您可以打开一个辅助连接以保持并行刷新?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-21
      • 2021-08-22
      • 2021-05-20
      • 1970-01-01
      • 2011-07-07
      • 2021-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多