【发布时间】: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