Function execution is taking more than 2hrs

From: Raghavendra Rao J S V <raghavendrajsv(at)gmail(dot)com>
To: pgsql-general(at)lists(dot)postgresql(dot)org
Subject: Function execution is taking more than 2hrs
Date: 2018-02-06 10:06:33
Message-ID: CAEHH7R7vfZTwE9JBLTOs+Jn1uPQS6ZD9zGCkUGc0akBorjNYuA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Device id column logic has changed in my organization. Therefore, I need to
modify all the old device id values to new device id value of the tables
which contains the device id column. Old device id and new device id
columns are mapped in “old_new_deviceids” table.

There are twenty tables which contains device id column. Therefore I need
to modify the device id’s in all those twenty tables based on
“old_new_deviceids” table . Each and every table will contains around
2Lakhs records.

I have created a dynamic procedure using* EXECUTE FORMAT* ,which accepts
table name and column name as input parameter as below.

*CREATE OR REPLACE FUNCTION pop_endpoints_with_new_deviceid() *

RETURNS void

AS $$

DECLARE

--tables text[] =
ARRAY['tcconfig_endpointlist','medianode','calldetailrecord','calldetailrecord','statsciscotbgcallstreamsource','statsciscotbgcallchannelsaudio','statsciscotbgcallchannelsvideo','statsciscotbgperipheral','statsciscotbgperipheralhistory','statsciscotbgcall','statsciscotpcall','statsciscotpcallstreamsource','statsciscotpperipheral','statsciscotpperipheralhistory','statsciscotpcallstreamtype','statsciscophonecallstream','monthlyendpointnoshow','monthlyendpointutilization','mtg_src_nd_prtcpnts'];

--columns text[]=
ARRAY['element','deviceid','deviceid','destdeviceid','deviceid','deviceid','deviceid','deviceid','deviceid','deviceid','deviceid','deviceid','deviceid','deviceid','deviceid','deviceid','deviceid','deviceid','source'];

--v_select varchar(5000);

-- rec record;

BEGIN

--This funciton updates the deviceid column for all tables
which contains endpoint details using endpoint_deviceids_barediscovery
table through pop_new_deviceid funciton

RAISE NOTICE 'Updation of deviceid column for dependent
tables which contains endpoints related information has started';

PERFORM insert_log('INFO' ,'pop_endpoints_with_new_deviceid'
,'Updation of deviceid column for dependent tables which contains endpoints
related information has started');

PERFORM pop_new_deviceid_for_table(‘Table_Name1','deviceid');

PERFORM pop_new_deviceid_for_table(‘Table_Name2','deviceid');

PERFORM pop_new_deviceid_for_table(‘Table_Name3','deviceid');

PERFORM pop_new_deviceid_for_table(‘Table_Name4','deviceid');

PERFORM pop_new_deviceid_for_table(‘Table_Name5','deviceid');

PERFORM pop_new_deviceid_for_table(‘Table_Name6','deviceid');

PERFORM pop_new_deviceid_for_table(‘Table_Name7','deviceid');

PERFORM pop_new_deviceid_for_table(‘Table_Name8','deviceid');

PERFORM pop_new_deviceid_for_table(‘Table_Name9','deviceid');

PERFORM pop_new_deviceid_for_table(‘Table_Name10','deviceid');

PERFORM pop_new_deviceid_for_table(‘Table_Name11','deviceid');

PERFORM pop_new_deviceid_for_table(‘Table_Name12',deviceid');

PERFORM pop_new_deviceid_for_table(‘Table_Name13','deviceid');

PERFORM pop_new_deviceid_for_table(‘Table_Name14','deviceid');

PERFORM pop_new_deviceid_for_table(‘Table_Name15','deviceid');

PERFORM pop_new_deviceid_for_table(‘Table_Name16','deviceid');

PERFORM pop_new_deviceid_for_table(‘Table_Name17','deviceid');

PERFORM pop_new_deviceid_for_table(‘Table_Name18','deviceid');

PERFORM pop_new_deviceid_for_table(‘Table_Name19','deviceid');

PERFORM pop_new_deviceid_for_table(‘Table_Name20','deviceid');

RAISE NOTICE 'Updation of deviceid column for dependent
tables which contains endpoints related information has completed
successfully';

PERFORM insert_log('INFO' ,'pop_endpoints_with_new_deviceid'
,'Updation of deviceid column for dependent tables which contains endpoints
related information has completed successfully');

EXCEPTION WHEN OTHERS THEN

RAISE NOTICE 'Error occurred while executing
pop_endpoints_with_new_deviceid % %', SQLERRM, SQLSTATE;

PERFORM insert_log('ERROR'
,'pop_endpoints_with_new_deviceid' ,'Error occurred while executing
pop_endpoints_with_new_deviceid
'||SQLSTATE||' '||SQLERRM);

*END;*

*$$ LANGUAGE plpgsql;*

*CREATE OR REPLACE FUNCTION pop_new_deviceid_for_table(p_table
varchar,p_column varchar) *

*RETURNS void *

AS $$

DECLARE

v_select varchar(5000);

id_error_count int:=0;

rec record;

BEGIN

--This funciton updates the deviceid column for spcified table using
endpoint_deviceids_barediscovery table after rediscovery

v_select:='SELECT distinct t2.deviceid_old,t2.deviceid_new

FROM '|| p_table
||' t1,endpoint_deviceids_barediscovery t2

WHERE t1.'||p_column||'=t2.deviceid_old

AND
t2.deviceid_new is not null';

RAISE NOTICE 'Updation of endpoints with newdeviceid for %
started and query is %',p_table,v_select;

PERFORM insert_log('INFO' ,'pop_new_deviceid_for_table'
,'Updation of endpoints with newdeviceid for '||p_table||' started.Query
is '|| v_select);

FOR rec IN EXECUTE v_select LOOP

BEGIN

EXECUTE FORMAT('UPDATE %I set %I = %s where
%I=%s',p_table,p_column,rec.deviceid_new,p_column,rec.deviceid_old);

EXCEPTION

WHEN OTHERS THEN

id_error_count:=id_error_count+1;

RAISE NOTICE
'Error occurred while updating new deviceid column of % table for deviceid
(%) % using pop_new_deviceid_for_table %
%',p_table,p_column,rec.deviceid_old, SQLERRM, SQLSTATE;

END;

END LOOP;

EXCEPTION WHEN OTHERS THEN

RAISE NOTICE 'Error occurred while executing
pop_new_deviceid_for_table for % table % %', p_table,SQLERRM,
SQLSTATE;

PERFORM insert_log('ERROR' ,'pop_new_deviceid_for_table' ,'Error
occurred while executing pop_endpoints_with_old_deviceid for '||p_table||'
table '||SQLSTATE||' '||SQLERRM);

*END;*

*$$ LANGUAGE plpgsql;*

When I execute select pop_endpoints_with_new_deviceid() it will update 20
tables in single shot. Some of the environments it got completed in 5
minutes and some of the environments it is taking around 2hrs 25 minutes. I
have experienced this issue several times with different environments. But
the data and configuration settings of the all environments are same. There
are no locks in the database while this script is executing.

*Please guide me *

*Sometimes “select pop_endpoints_with_new_deviceid()” is taking just 5
minutes and some times more than 2hrs 25 minutes. how to narrow down the
issue*

* How to do the bulk update /insert/delete in postgres? Do I need to modify
any configuration parameters in the database?*

*How to tack the time taken by each function in postgres?*

--
Regards,
Raghavendra Rao J S V
Mobile- 8861161425

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Dhandapani Shanmugam 2018-02-06 11:01:47 PostgreSQL Active-Active
Previous Message Jeremy Finzel 2018-02-06 07:36:04 Re: Alter table set logged hanging after writing out all WAL