Dear expert,
Could you please review and suggest to optimize performance of the PLSQL
procedure in PostgreSQL?
I have attached the same.
Thanks in advance
Regards,
Dinesh Chandra
________________________________
DISCLAIMER:
This email message is for the sole use of the intended recipient(s) and may
contain confidential and privileged information. Any unauthorized review, use,
disclosure or distribution is prohibited. If you are not the intended
recipient, please contact the sender by reply email and destroy all copies of
the original message. Check all attachments for viruses before opening them.
All views or opinions presented in this e-mail are those of the author and may
not reflect the opinion of Cyient or those of our affiliates.
-----Function to get weather forcast based on threshold value of weather
parameters
CREATE OR REPLACE FUNCTION dome.geteffectiveforcast4(
coldmaxtemp double precision,
coldmintemp double precision,
hotmaxtemp double precision,
hotmintemp double precision,
windmax double precision,
windmin double precision,
rainmax double precision,
rainmin double precision,
humiditymax double precision,
humiditymin double precision,
snowmax double precision,
snowmin double precision)
RETURNS SETOF "TABLE(lockey text, from_time timestamp without time zone,
to_time timestamp without time zone, weathertype text, flood_height text,
severity text)"
LANGUAGE 'plpgsql'
COST 100.0
VOLATILE
ROWS 1000.0
AS $function$
BEGIN
RETURN QUERY select s."LocKey",min(s.dt) from_time, max(s.dt) to_time,'Red
Cold Temperature' as WeatherType,'' as "Flood_height",'' as "Severity" from (
select "LocKey","Date" + "Time" as dt,
row_number() over (partition by "LocKey" order by
"Date" + "Time") as rn,
("Date" + "Time" - (concat(row_number() over
(partition by "LocKey" order by "Date" + "Time"),' hours')::interval)) as grp
from dome."AccuWeatherForcastHourly" where "Temperature"<0
order by "LocKey", "Date" + "Time") s
group by s."LocKey",s.grp
UNION
select s."LocKey",min(s.dt) from_time, max(s.dt)
to_time,'Amber Cold Temperature' as WeatherType,'' as "Flood_height",'' as
"Severity" from (
select "LocKey","Date" + "Time" as dt,row_number() over
(partition by "LocKey" order by "Date" + "Time") as rn,
("Date" + "Time" - (concat(row_number() over
(partition by "LocKey" order by "Date" + "Time"),' hours')::interval)) as grp
from dome."AccuWeatherForcastHourly"
where "Temperature">=coldmintemp and "Temperature"<= coldmaxtemp
order by "LocKey", "Date" + "Time") s
group by s."LocKey",s.grp
UNION
select s."LocKey",min(s.dt) from_time, max(s.dt)
to_time,'Red Hot Temperature' as WeatherType,'' as "Flood_height",'' as
"Severity" from (
select "LocKey","Date" + "Time" as dt,row_number() over
(partition by "LocKey" order by "Date" + "Time") as rn,
("Date" + "Time" - (concat(row_number() over (partition by
"LocKey" order by "Date" + "Time"),' hours')::interval)) as grp
from dome."AccuWeatherForcastHourly" where "Temperature" >
hotmaxtemp
order by "LocKey", "Date" + "Time") s
group by s."LocKey",s.grp
UNION
select s."LocKey",min(s.dt) from_time, max(s.dt)
to_time,'Amber Cold Temperature' as WeatherType,'' as "Flood_height",'' as
"Severity" from (
select "LocKey","Date" + "Time" as dt,
row_number() over (partition by "LocKey" order by "Date" +
"Time") as rn,
("Date" + "Time" - (concat(row_number() over (partition by
"LocKey" order by "Date" + "Time"),' hours')::interval)) as grp
from dome."AccuWeatherForcastHourly"
where "Temperature" between hotmintemp and hotmaxtemp
order by "LocKey", "Date" + "Time") s
group by s."LocKey",s.grp
UNION
select s."LocKey",min(s.dt) from_time, max(s.dt)
to_time,'Red Wind Speed' as WeatherType,'' as "Flood_height",'' as "Severity"
from (
select "LocKey","Date" + "Time" as dt,
row_number() over (partition by "LocKey" order by "Date" + "Time")
as rn,
("Date" + "Time" - (concat(row_number() over (partition by
"LocKey" order by "Date" + "Time"),' hours')::interval)) as grp
from dome."AccuWeatherForcastHourly"
where "Wind Speed" >windmax
order by "LocKey", "Date" + "Time") s
group by s."LocKey",s.grp
UNION
select s."LocKey",min(s.dt) from_time, max(s.dt)
to_time,'Amber Wind Speed' as WeatherType,'' as "Flood_height",'' as "Severity"
from (
select "LocKey","Date" + "Time" as dt,
row_number() over (partition by "LocKey" order by "Date" + "Time")
as rn,
("Date" + "Time" - (concat(row_number() over (partition by
"LocKey" order by "Date" + "Time"),' hours')::interval)) as grp
from dome."AccuWeatherForcastHourly"
where "Wind Speed" between windmin and windmax
order by "LocKey", "Date" + "Time") s
group by s."LocKey",s.grp
UNION
select s."LocKey",min(s.dt) from_time, max(s.dt)
to_time,'Red Rain' as WeatherType,
s."Flood_height",s."Severity" from (select
"LocKey","Date" + "Time" as dt,
row_number() over (partition by "LocKey" order by
"Date" + "Time") as rn,
("Date" + "Time" - (concat(row_number() over (partition by "LocKey"
order by "Date" + "Time"),' hours')::interval)) as grp
,fc."Flood_height",fc."Severity" from
dome."AccuWeatherForcastHourly",dome.flood_config2 fc
where "Rain" >rainmax and "Rain" between
fc."Accuweather_MinRain" and fc."Accuweather_MaxRain"
order by "LocKey", "Date" + "Time") s
group by s."LocKey",s.grp,s."Flood_height",s."Severity"
UNION
select s."LocKey",min(s.dt) from_time, max(s.dt)
to_time,'Amber Rain' as WeatherType,s."Flood_height",s."Severity" from (
select "LocKey","Date" + "Time" as dt,
row_number() over (partition by "LocKey" order by "Date" + "Time")
as rn,
("Date" + "Time" - (concat(row_number() over (partition by
"LocKey" order by "Date" + "Time"),' hours')::interval)) as grp
,fc."Flood_height",fc."Severity" from
dome."AccuWeatherForcastHourly",dome.flood_config2 fc
where "Rain" between rainmin and rainmax and "Rain" between
fc."Accuweather_MinRain" and fc."Accuweather_MaxRain"
order by "LocKey", "Date" + "Time") s
group by s."LocKey",s.grp,s."Flood_height",s."Severity"
UNION
select s."LocKey",min(s.dt) from_time, max(s.dt)
to_time,'Red Snow' as WeatherType,'' as "Flood_height",'' as "Severity" from (
select "LocKey","Date" + "Time" as dt,
row_number() over (partition by "LocKey" order by "Date" + "Time")
as rn,
("Date" + "Time" - (concat(row_number() over (partition by
"LocKey" order by "Date" + "Time"),' hours')::interval)) as grp
from dome."AccuWeatherForcastHourly"
where "Snow" >snowmax
order by "LocKey", "Date" + "Time") s
group by s."LocKey",s.grp
UNION
select s."LocKey",min(s.dt) from_time, max(s.dt)
to_time,'Amber Snow' as WeatherType,'' as "Flood_height",'' as "Severity" from (
select "LocKey","Date" + "Time" as dt,
row_number() over (partition by "LocKey" order by "Date" + "Time")
as rn,
("Date" + "Time" - (concat(row_number() over (partition by
"LocKey" order by "Date" + "Time"),' hours')::interval)) as grp
from dome."AccuWeatherForcastHourly"
where "Snow" between snowmin and snowmax
order by "LocKey", "Date" + "Time") s
group by s."LocKey",s.grp
UNION
select s."LocKey",min(s.dt) from_time, max(s.dt)
to_time,'Red Humidity' as WeatherType,'' as "Flood_height",'' as "Severity"
from (
select "LocKey","Date" + "Time" as dt,
row_number() over (partition by "LocKey" order by "Date" + "Time")
as rn,
("Date" + "Time" - (concat(row_number() over (partition by
"LocKey" order by "Date" + "Time"),' hours')::interval)) as grp
from dome."AccuWeatherForcastHourly"
where "Humidity" >humiditymax
order by "LocKey", "Date" + "Time") s
group by s."LocKey",s.grp
UNION
select s."LocKey",min(s.dt) from_time, max(s.dt)
to_time,'Amber Humidity' as WeatherType,'' as "Flood_height",'' as "Severity"
from (
select "LocKey","Date" + "Time" as dt,
row_number() over (partition by "LocKey" order by "Date" + "Time")
as rn,
("Date" + "Time" - (concat(row_number() over (partition by
"LocKey" order by "Date" + "Time"),' hours')::interval)) as grp
from dome."AccuWeatherForcastHourly"
where "Humidity" between humiditymin and humiditymax
order by "LocKey", "Date" + "Time") s
group by s."LocKey",s.grp;
END;
$function$;
-----Query executing the above Weather Forcast function
Select GA.*,forcast.from_time::date as fromdate,forcast.from_time::time as
fromtime,forcast.to_time::date as todate,forcast.to_time::time as
totime,forcast.weathertype,forcast.flood_height,forcast.severity as
flood_severity from dome.gridassetinfo3 GA
,dome.geteffectiveforcast4({0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11})
forcast where forcast.lockey = cast(GA.lockey as text)
---Function to get lightning impacted asset information
CREATE OR REPLACE FUNCTION dome.getlightningimpactedassets(
asset_table text,
buffer double precision)
RETURNS SETOF "TABLE(lightningdate date, lightningtime time without time
zone, latitude double precision, longitude double precision, amplitude double
precision, distance double precision, feedername character varying, assetid
bigint, assetcategory character varying, asset_xy character varying,
customer_xy character varying)"
LANGUAGE 'plpgsql'
COST 100.0
VOLATILE
ROWS 1000.0
AS $function$
BEGIN
RETURN QUERY Select
light.*,ga.feedername,ga.assetid,ga.assetcategory,ga.asset_xy,ga.customer_xy
from dome.lightning light join dome.gridassetinfo3 ga
on
st_intersects(st_buffer(st_point(light.latitude,light.longitude),buffer),ST_GeomFromText('MULTIPOINT('||ga.asset_xy||')'))
where ga.assettable=asset_table;
END;
$function$;