we are in the process of performance tuning , the below program is taking time, Please guide us to tune further or can we write any other way to improve the performance,
CREATE OR REPLACE TYPE "RECO_FE" FORCE AS OBJECT
(
o_o_id VARCHAR2(18 CHAR),
o_gl_no VARCHAR2(35 CHAR),
o_p_key VARCHAR2(5 CHAR),
o_p_name VARCHAR2(35 CHAR),
o_c_b_sum NUMBER(18,3),
o_d_b_sum NUMBER(18,3),
o_o_b_sum NUMBER(18,3),
o_c_sum NUMBER(18,3),
o_d_sum NUMBER(18,3),
o_de_sum NUMBER(18,3)
);
/
CREATE OR REPLACE TYPE "RECO_FI_COL" FORCE AS TABLE OF RECO_FE;
/
CREATE OR REPLACE PROCEDURE TA_RE_FILE
(
pi_id IN VARCHAR2,
pi_no IN NUMBER,
pi_reco_coll OUT RECO_FI_COL
)
IS
V_OBJ_RECONCI RECO_FI_COL;
V_OBJ_RECO_COLL RECO_FI_COL:= RECO_FI_COL();
BEGIN
SELECT RECO_FE(EX_TA_O_ID,TA_g_AC_CRDT, TA_pr_key, TA_pr_na, SUM(TA_CR_BA_LOC),NULL, NULL, NULL, NULL, NULL)BULK COLLECT INTO V_OBJ_RECONCI
FROM TA_no_AC
WHERE FK_TARB_BANK_REPORT_ID=pi_no
AND EX_TA_O_ID=pi_id
AND TA_g_AC_CRDT IS NOT NULL
GROUP BY EX_TA_O_ID, TA_g_AC_CRDT, TA_pr_key, TA_pr_na;
V_OBJ_RECO_COLL := V_OBJ_RECO_COLL MULTISET UNION V_OBJ_RECONCI;
SELECT RECO_FE(EX_TA_O_ID,TANA_GL_ACCT_DBT, TA_pr_key, TA_pr_na,NULL, SUM(TA_DE_BA_LOC), NULL, NULL, NULL, NULL) BULK COLLECT INTO V_OBJ_RECONCI
FROM TA_no_AC
WHERE FK_TARB_BANK_REPORT_ID=pi_no
AND EX_TA_O_ID=pi_id
AND TANA_GL_ACCT_DBT IS NOT NULL
GROUP BY EX_TA_O_ID, TANA_GL_ACCT_DBT, TA_pr_key, TA_pr_na;
V_OBJ_RECO_COLL := V_OBJ_RECO_COLL MULTISET UNION V_OBJ_RECONCI;
SELECT RECO_FE(EX_TA_O_ID, TANA_GL_ACCT_OVERDRFT,TA_pr_key, TA_pr_na, NULL,NULL, SUM(TA_OVE_BAL_LOC), NULL, NULL, NULL)BULK COLLECT INTO V_OBJ_RECONCI
FROM TA_no_AC
WHERE FK_TARB_BANK_REPORT_ID=pi_no
AND EX_TA_O_ID=pi_id
AND TANA_GL_ACCT_OVERDRFT IS NOT NULL
GROUP BY EX_TA_O_ID, TANA_GL_ACCT_OVERDRFT, TA_pr_key, TA_pr_na;
V_OBJ_RECO_COLL := V_OBJ_RECO_COLL MULTISET UNION V_OBJ_RECONCI;
pi_reco_coll := V_OBJ_RECO_COLL;
END;
You've got almost the same query run three times. Then unioning the results in PL/SQL.
Can't you have one SQL statement that unions these together instead?
For us to give more meaningful help, we're going to need to see details of what exactly is going on and how long it takes. i.e. execution (not explain!) plans for your SQL, run times for your PL/SQL, etc.
To get the plans, trace your session and run your code. Then parse the trace files witk TKPROF. You can find instructions on how to do this at:
https://blogs.oracle.com/sql/how-to-create-an-execution-plan#tkprof It may also be worth profiling the PL/SQL to see if those multiset unions are what's taking the time. Read about this at:
https://oracle-base.com/articles/11g/plsql-hierarchical-profiler-11gr1