Thread: How to save the results of replace(split_part(trim(both ' ' from "vx6000__12channel"),'__',2),'channel','myChannel') in my query into a temp variable?

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
On 12/12/2009 09:59 AM, zxo102 ouyang wrote:
> 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
>

Are you sure that is what is taking so much time?  I'd bet its not.  You should find the thing that is taking the most
timeand optimize that. 

Have you run your query with explain analyze?  If you post the output here (or use http://explain.depesz.com/) someone
mightbe able to point you in a helpful direction. 

I'm not saying the replace(split_part... isn't worth optimizing, it probably is, I'm just saying, fix the slowest thing
first.

-Andy