zrychleni pv forecast per day
This commit is contained in:
@@ -0,0 +1,8 @@
|
|||||||
|
-- ============================================================
|
||||||
|
-- Forecast PV: urychlení denních/range dotazů podle interval_start
|
||||||
|
-- (fn_forecast_pv_split, pv-slots* funkce)
|
||||||
|
-- ============================================================
|
||||||
|
|
||||||
|
create index if not exists idx_forecast_pv_interval_start_run
|
||||||
|
on ems.forecast_pv_interval (interval_start, run_id);
|
||||||
|
|
||||||
18
db/migration/V066__latest_telemetry_distinct_on_indexes.sql
Normal file
18
db/migration/V066__latest_telemetry_distinct_on_indexes.sql
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
-- =============================================================
|
||||||
|
-- V066__latest_telemetry_distinct_on_indexes.sql
|
||||||
|
-- Zrychlení view ems.vw_latest_* (PostgREST dashboard endpoints).
|
||||||
|
--
|
||||||
|
-- View používají DISTINCT ON (...) s ORDER BY ... measured_at desc.
|
||||||
|
-- Bez odpovídajících indexů může plán spadnout na scan+sort nad
|
||||||
|
-- velkými Timescale hypertabulkami (sekundy latency).
|
||||||
|
-- =============================================================
|
||||||
|
|
||||||
|
create index if not exists idx_telemetry_inverter_site_inverter_time_desc
|
||||||
|
on ems.telemetry_inverter (site_id, inverter_id, measured_at desc);
|
||||||
|
|
||||||
|
create index if not exists idx_telemetry_ev_site_charger_connector_time_desc
|
||||||
|
on ems.telemetry_ev_charger (site_id, charger_id, connector_id, measured_at desc);
|
||||||
|
|
||||||
|
create index if not exists idx_telemetry_hp_site_heat_pump_time_desc
|
||||||
|
on ems.telemetry_heat_pump (site_id, heat_pump_id, measured_at desc);
|
||||||
|
|
||||||
@@ -3,10 +3,21 @@ returns jsonb
|
|||||||
language sql
|
language sql
|
||||||
stable
|
stable
|
||||||
as $fn$
|
as $fn$
|
||||||
with latest as (
|
with tz as (
|
||||||
|
select coalesce(nullif(trim(s.timezone), ''), 'Europe/Prague') as tz_name
|
||||||
|
from ems.site s
|
||||||
|
where s.id = p_site_id
|
||||||
|
),
|
||||||
|
bounds as (
|
||||||
|
select
|
||||||
|
((p_day::timestamp) at time zone tz.tz_name) as day_start_utc,
|
||||||
|
(((p_day + 1)::timestamp) at time zone tz.tz_name) as day_end_utc
|
||||||
|
from tz
|
||||||
|
),
|
||||||
|
latest as (
|
||||||
select distinct on (fpi.interval_start, fpr.pv_array_id)
|
select distinct on (fpi.interval_start, fpr.pv_array_id)
|
||||||
fpi.run_id,
|
fpi.run_id,
|
||||||
fpi.pv_array_id,
|
fpr.pv_array_id,
|
||||||
fpi.interval_start,
|
fpi.interval_start,
|
||||||
fpi.power_w,
|
fpi.power_w,
|
||||||
fpi.irradiance_wm2,
|
fpi.irradiance_wm2,
|
||||||
@@ -18,22 +29,15 @@ as $fn$
|
|||||||
join ems.asset_pv_array apa
|
join ems.asset_pv_array apa
|
||||||
on apa.id = fpr.pv_array_id
|
on apa.id = fpr.pv_array_id
|
||||||
and apa.site_id = fpr.site_id
|
and apa.site_id = fpr.site_id
|
||||||
|
cross join bounds b
|
||||||
where fpr.site_id = p_site_id
|
where fpr.site_id = p_site_id
|
||||||
and (
|
|
||||||
fpi.interval_start at time zone coalesce(
|
|
||||||
nullif(trim((select timezone from ems.site s where s.id = p_site_id)), ''),
|
|
||||||
'Europe/Prague'
|
|
||||||
)
|
|
||||||
)::date = p_day
|
|
||||||
and fpr.status = 'ok'
|
and fpr.status = 'ok'
|
||||||
|
and fpi.interval_start >= b.day_start_utc
|
||||||
|
and fpi.interval_start < b.day_end_utc
|
||||||
order by fpi.interval_start, fpr.pv_array_id, fpr.created_at desc
|
order by fpi.interval_start, fpr.pv_array_id, fpr.created_at desc
|
||||||
),
|
),
|
||||||
rows as (
|
rows as (
|
||||||
select
|
select
|
||||||
case
|
|
||||||
when controllable then 'a'
|
|
||||||
else 'b'
|
|
||||||
end as pole,
|
|
||||||
jsonb_build_object(
|
jsonb_build_object(
|
||||||
'run_id', run_id,
|
'run_id', run_id,
|
||||||
'pv_array_id', pv_array_id,
|
'pv_array_id', pv_array_id,
|
||||||
|
|||||||
Reference in New Issue
Block a user