Hi everyone,

   I have a big query (see below attached) in which all where clauses have
 sc.channel = replace(split_part(trim(both ' ' from
ec.instantance_flux),'__',2),'channel','myChannel').
The value of ec.instantance_flux is like the format: "vx6000__12channel". I
want to replace "channel" with "myChannel": "vx6000__12myChannel".

Since the query take all most 40 minutes, I want to "optimize" it to see if
i can get it done in shorter time.  My question is: are there any way just
do once:
                                  replace(split_part(trim(both ' ' from
ec.instantance_flux),'__',2),'channel','myChannel')
and save its result into "temp". The other where clause just use
                                                 sc.channel = temp
instead of  doing
                                                sc.channel
= replace(split_part(trim(both ' ' from
ec.instantance_flux),'__',2),'channel','myChannel')
for 12 times in my query.

Thanks for your help in advance.

OUyang


#####################################################333
select rt_data.r_flowmeter_caliber as  r_flowmeter_caliber,
       rt_data.r_max01_sloc as r_max01_sloc,
       rt_data.r_max01_sdata as r_max01_sdata,
       rt_data.r_max01_sdate as r_max01_sdate,
       rt_data.r_min01_sdata as r_min01_sdata,
      rt_data.r_min01_sdate as r_min01_sdate,
      rt_data.r_avg01_sdata as r_avg01_sdata,
       acc_data.r_end_sdate as r_end_sdate,
       acc_data.r_end_sdata as r_end_sdata,
 acc_data.r_start_sdate as r_start_sdate,
acc_data.r_start_sdata as r_start_sdata,
acc_data.r_acc_sdata as r_acc_sdata
from
( select ec.flowmeter_caliber as r_flowmeter_caliber,
max01.r_sloc as r_max01_sloc,
round(max01.r_sdata*100)/100 as r_max01_sdata,
max01.r_sdate as r_max01_sdate,
round(min01.r_sdata*100)/100 as r_min01_sdata,
min01.r_sdate as r_min01_sdate,
round(avg01.r_sdata*100)/100 as r_avg01_sdata,
max01.r_channel as r_channel,
max01.r_sid as r_sid,
max01.r_sloc as r_sloc
from (
select max(rd01.sensor_data) as r_sdata,
sc.external_ins as r_sloc,
rd01.sensor_id as r_sid,
(select rd02.sensor_date
from record_data rd02,
sensor_cfg sc,
energy_classification02 ec
where rd02.sensor_id = rd01.sensor_id and
rd02.sensor_date between '2009-12-10' and '2009-12-12' and
       sc.sensor_id = rd02.sensor_id and
sc.external_ins=ec.measure_name and
sc.channel = replace(split_part(trim(both ' ' from
ec.instantance_flux),'__',2),'channel','myChannel') and
sc.channel = rd02.sensor_channel and
sc.remarks='I_VALUE' and
ec.flowmeter_caliber='I_FLOW'
order by rd02.sensor_data DESC limit 1
) as r_sdate,
rd01.sensor_channel as r_channel
from record_data rd01,
sensor_cfg sc,
energy_classification02 ec
where  rd01.sensor_date between '2009-12-10' and '2009-12-12' and
sc.sensor_id = rd01.sensor_id and
sc.external_ins=ec.measure_name and
sc.channel = replace(split_part(trim(both ' ' from
ec.instantance_flux),'__',2),'channel','myChannel') and
sc.channel = rd01.sensor_channel and
       sc.remarks='I_VALUE' and
ec.flowmeter_caliber='I_FLOW'
group by rd01.sensor_id, sc.external_ins, rd01.sensor_channel
) max01,
( select min(rd01.sensor_data) as r_sdata,
rd01.sensor_id as r_sid,
(select rd02.sensor_date
from record_data rd02, sensor_cfg sc, energy_classification02 ec
where rd02.sensor_id= rd01.sensor_id and
rd02.sensor_date between '2009-12-10' and '2009-12-12' and
       sc.sensor_id = rd02.sensor_id and
sc.external_ins=ec.measure_name and
sc.channel = replace(split_part(trim(both ' ' from
ec.instantance_flux),'__',2),'channel','myChannel') and
sc.channel = rd02.sensor_channel and
       sc.remarks='I_VALUE' and
ec.flowmeter_caliber='I_FLOW'
order by rd02.sensor_data ASC limit 1
) as r_sdate,
rd01.sensor_channel as r_channel
from record_data rd01, sensor_cfg sc, energy_classification02 ec
where rd01.sensor_date between '2009-12-10' and '2009-12-12' and
sc.sensor_id = rd01.sensor_id and
sc.external_ins=ec.measure_name and
sc.channel = replace(split_part(trim(both ' ' from
ec.instantance_flux),'__',2),'channel','myChannel') and
sc.channel = rd01.sensor_channel and
sc.remarks='I_VALUE' and
ec.flowmeter_caliber='I_FLOW'
group by rd01.sensor_id, rd01.sensor_channel
) min01,
( select avg(rd01.sensor_data) as r_sdata,
rd01.sensor_id as r_sid,
       (select rd02.sensor_date from record_data rd02, sensor_cfg sc,
energy_classification02 ec
       where rd02.sensor_id = rd01.sensor_id and
       rd02.sensor_date between '2009-12-10' and '2009-12-12' and
       sc.sensor_id = rd02.sensor_id and
sc.external_ins=ec.measure_name and
       sc.channel = replace(split_part(trim(both ' ' from
ec.instantance_flux),'__',2),'channel','myChannel') and
sc.channel = rd02.sensor_channel and
       sc.remarks='I_VALUE' and
       ec.flowmeter_caliber='I_FLOW'
       order by rd02.sensor_data ASC limit 1
        ) as r_sdate,
rd01.sensor_channel as r_channel
       from record_data rd01, sensor_cfg sc, energy_classification02 ec
       where rd01.sensor_date between '2009-12-10' and '2009-12-12' and
       sc.sensor_id = rd01.sensor_id and
       sc.external_ins=ec.measure_name and
       sc.channel = replace(split_part(trim(both ' ' from
ec.instantance_flux),'__',2),'channel','myChannel') and
       sc.channel=rd01.sensor_channel and
       sc.remarks='I_VALUE' and
       ec.flowmeter_caliber='I_FLOW'
group by rd01.sensor_id,rd01.sensor_channel
 ) avg01,
energy_classification02 ec,
sensor_cfg sc
where  max01.r_sid=min01.r_sid and
min01.r_sid=avg01.r_sid and
max01.r_sid=sc.sensor_id and
sc.channel = replace(split_part(trim(both ' ' from
ec.instantance_flux),'__',2),'channel','myChannel') and
sc.channel= min01.r_channel and
sc.channel=max01.r_channel and
sc.channel=avg01.r_channel and
sc.external_ins=ec.measure_name and
sc.remarks='I_VALUE' and
ec.flowmeter_caliber='I_FLOW'
) rt_data,
( select round(max01.r_sdata-min01.r_sdata)*100/100 as r_acc_sdata,
       max01.r_sid as r_sid, max01.r_sloc as r_sloc,
       max01.r_sdate   as r_end_sdate,
       max01.r_sdata as r_end_sdata,
       min01.r_sdate as r_start_sdate,
       min01.r_sdata as r_start_sdata
from (
select max(rd01.sensor_date) as r_sdate,
sc.external_ins as r_sloc,
       rd01.sensor_id as r_sid,
(select rd02.sensor_data
from record_data rd02,
sensor_cfg sc,
energy_classification02 ec
where rd02.sensor_id = rd01.sensor_id and
       rd02.sensor_date between '2009-12-10' and '2009-12-12' and
       sc.sensor_id = rd02.sensor_id and
       sc.external_ins=ec.measure_name and
       sc.channel = replace(split_part(trim(both ' ' from
ec.flow_accumulation),'__',2),'channel','myChannel') and
       sc.channel = rd02.sensor_channel and
       sc.remarks='K_FLOW' and
       ec.flowmeter_caliber='I_FLOW'
       order by rd02.sensor_date DESC limit 1
) as r_sdata,
rd01.sensor_channel as r_channel
from record_data rd01,
sensor_cfg sc,
energy_classification02 ec
where  rd01.sensor_date between '2009-12-10' and '2009-12-12' and
sc.sensor_id = rd01.sensor_id and
sc.external_ins=ec.measure_name and
sc.channel = replace(split_part(trim(both ' ' from
ec.flow_accumulation),'__',2),'channel','myChannel') and
sc.channel = rd01.sensor_channel and
sc.remarks='K_FLOW' and
ec.flowmeter_caliber='I_FLOW'
group by rd01.sensor_id, sc.external_ins, rd01.sensor_channel
) max01,
( select min(rd01.sensor_date) as r_sdate,
       rd01.sensor_id as r_sid,
       (select rd02.sensor_data
from record_data rd02,
sensor_cfg sc,
energy_classification02 ec
       where rd02.sensor_id= rd01.sensor_id and
       rd02.sensor_date between '2009-12-10' and '2009-12-12' and
       sc.sensor_id = rd02.sensor_id and
       sc.external_ins=ec.measure_name and
       sc.channel = replace(split_part(trim(both ' ' from
ec.flow_accumulation),'__',2),'channel','myChannel') and
       sc.channel = rd02.sensor_channel and
       sc.remarks='K_FLOW' and
       ec.flowmeter_caliber='I_FLOW'
       order by rd02.sensor_date ASC limit 1
) as r_sdata,
rd01.sensor_channel as r_channel
from record_data rd01,
sensor_cfg sc,
energy_classification02 ec
where rd01.sensor_date between '2009-12-10' and '2009-12-12' and
sc.sensor_id = rd01.sensor_id and
sc.external_ins=ec.measure_name and
sc.channel = replace(split_part(trim(both ' ' from
ec.flow_accumulation),'__',2),'channel','myChannel') and
sc.channel = rd01.sensor_channel and
sc.remarks='K_FLOW' and
ec.flowmeter_caliber='I_FLOW'
group by rd01.sensor_id, rd01.sensor_channel
) min01,
energy_classification02 ec,
sensor_cfg sc
where  max01.r_sid=min01.r_sid and
max01.r_sid=sc.sensor_id and
sc.channel = replace(split_part(trim(both ' ' from
ec.flow_accumulation),'__',2),'channel','myChannel') and
sc.channel= min01.r_channel and
sc.channel=max01.r_channel and
sc.external_ins=ec.measure_name and
sc.remarks='K_FLOW' and
ec.flowmeter_caliber='I_FLOW') acc_data
 where acc_data.r_sloc = rt_data.r_sloc
order by  r_max01_sloc desc

Reply via email to