Help me to tune this pl/sql code...
This code takes almost 3 minutes to execute....can you help where to improve?
BEGIN
DECLARE
v_CntTextIdNotProcessed NUMBER:=0;
BEGIN
SELECT COUNT(1) INTO v_CntTextIdNotProcessed FROM COB_T_LT_TEXTID_SO_RECOMPILE WHERE IsProcessed = 0;
IF (v_CntTextIdNotProcessed > 0) THEN
BEGIN
INSERT INTO COB_T_LANG_TRANS_OPERATION
OPERATIONID,
OPERATIONCODE,
OPERATIONREVISION,
ISPROCESSED,
CREATEDON,
CREATEDBY
SELECT DISTINCT
Id,
OperationCode,
OperationRevision,
0,
cob_f_getutc,
'COB_WP_INS_LANG_TRANS_SO'
From
SELECT Op.Id,Op.OperationCode,Op.OperationRevision
FROM Function_ Fn
INNER JOIN Function_Message Ft
ON Ft.Functionid = Fn.Id
AND Ft.Active =1
AND Fn.Active =1
INNER JOIN Text_Translation TT
ON TT.Textid = Ft.Textid
AND TT.Active =1
AND (TT.Short <> 'Null'
OR TT.Medium <> 'Null'
OR TT.Extended <> 'Null')
INNER JOIN Function_Type Fnty
ON Fn.Functiontype=Fnty.Functiontype
AND Fnty.Active =1
INNER JOIN Operation_Step_Function Osf
ON (Osf.Functionid=Fn.Id)
AND Osf.Active =1
INNER JOIN Operation_Step Os
ON Os.Id =Osf.Operationstepid
AND Os.Active=1
INNER JOIN Operation Op
ON Op.Id = Os.Operationid
-- AND op.defaultoperationrevision = 1
AND Op.Active =1
And Op.Revisionstatusid In (1,4)
AND TO_CHAR(Op.Id) IN (SELECT DISTINCT TO_CHAR(SUBSTR(FPV.PropertyValue,INSTR(FPV.PropertyValue, '<PropertyBagItem Key="OperationID"><Value xsi:type="xsd:int">')+61,9))
FROM
OPERATION OP
INNER JOIN OPERATION_STEP OS ON Op.Id = OS.OperationId
INNER JOIN OPERATION_STEP_FUNCTION OSF ON OS.Id = OSF.OperationStepId
INNER JOIN FUNCTION_ F ON OSF.FunctionId = F.id
AND F.FunctionType = 21
INNER JOIN FUNCTION_PROPERTY_VALUE FPV ON FPV.Functionid = F.Id
WHERE UPPER(OP.OperationRevision) = 'WRAPPER')
WHERE TT.TextID IN (SELECT TextId FROM COB_T_LT_TEXTID_SO_RECOMPILE WHERE IsProcessed = 0)
UNION
SELECT Op.Id,Op.OperationCode,Op.OperationRevision
FROM Function_Output Fo
INNER JOIN Function_Output_Routing Forout
ON Forout.Functionoutputid = Fo.Id
INNER JOIN Text_Translation TT
ON TT.Textid = Forout.PromptTextid
AND (TT.Short <> 'Null'
OR TT.Medium <> 'Null'
OR TT.Extended <> 'Null')
INNER JOIN Function_Output_Routing_Type Fort
ON Fort.Id=Forout.Outputroutingtypeid
INNER JOIN Text_Translation Ttdt
ON Ttdt.Textid = Fort.Textid
AND Ttdt.Languageid =1033
AND Upper(Ttdt.Extended) = 'USER'
INNER JOIN Function_ Fn
ON Fn.Id = Fo.Functionid
INNER JOIN Function_Type Fnty
ON Fn.Functiontype=Fnty.Functiontype
INNER JOIN Operation_Step_Function Osf
ON (Osf.Functionid=Fn.Id)
INNER JOIN Operation_Step Os
ON Os.Id=Osf.Operationstepid
INNER JOIN Operation Op
ON Op.Id = Os.Operationid
And Op.Revisionstatusid In (1,4)
AND to_char(Op.Id) IN (SELECT DISTINCT TO_CHAR(SUBSTR(FPV.PropertyValue,INSTR(FPV.PropertyValue, '<PropertyBagItem Key="OperationID"><Value xsi:type="xsd:int">')+61,9))
FROM
OPERATION OP
INNER JOIN OPERATION_STEP OS ON Op.Id = OS.OperationId
INNER JOIN OPERATION_STEP_FUNCTION OSF ON OS.Id = OSF.OperationStepId
INNER JOIN FUNCTION_ F ON OSF.FunctionId = F.id
AND F.FunctionType = 21
INNER JOIN FUNCTION_PROPERTY_VALUE FPV ON FPV.Functionid = F.Id
WHERE UPPER(OP.OperationRevision) = 'WRAPPER')
WHERE TT.TextID IN (SELECT TextId FROM COB_T_LT_TEXTID_SO_RECOMPILE WHERE IsProcessed = 0)
UNION
SELECT Op.Id,Op.OperationCode,Op.OperationRevision
FROM Function_Input Fi
INNER JOIN Text_Translation TT
ON ( TT.Textid = Fi.Prompttextid
AND TT.Active =1)
AND (TT.Short <> 'Null'
OR TT.Medium <> 'Null'
OR TT.Extended <> 'Null')
INNER JOIN Function_Input_Source_Type Fist
ON Fist.Id = Fi.Inputsourcetypeid
AND Fist.Active=1
INNER JOIN Text_Translation Ttdt
ON Ttdt.Textid = Fist.Textid
AND Ttdt.Active =1
AND Ttdt.Languageid = 1033
AND Upper(Ttdt.Extended) = 'USER'
INNER JOIN Function_ Fn
ON Fn.Id = Fi.Functionid
AND Fn.Active=1
INNER JOIN Function_Type Fnty
ON Fn.Functiontype=Fnty.Functiontype
AND Fnty.Active =1
INNER JOIN Operation_Step_Function Osf
ON Osf.Functionid=Fn.Id
AND Osf.Active =1
INNER JOIN Operation_Step Os
ON Os.Id = Osf.Operationstepid
AND Os.Active=1
INNER JOIN Operation Op
ON Op.Id = Os.Operationid
AND Op.Active =1
And Op.Revisionstatusid In (1,4)
AND TO_CHAR(Op.Id) IN (SELECT DISTINCT TO_CHAR(SUBSTR(FPV.PropertyValue,INSTR(FPV.PropertyValue, '<PropertyBagItem Key="OperationID"><Value xsi:type="xsd:int">')+61,9))
FROM
OPERATION OP
INNER JOIN OPERATION_STEP OS ON Op.Id = OS.OperationId
INNER JOIN OPERATION_STEP_FUNCTION OSF ON OS.Id = OSF.OperationStepId
INNER JOIN FUNCTION_ F ON OSF.FunctionId = F.id
AND F.FunctionType = 21
INNER JOIN FUNCTION_PROPERTY_VALUE FPV ON FPV.Functionid = F.Id
WHERE UPPER(OP.OperationRevision) = 'WRAPPER')
WHERE (TT.TextID IN (SELECT TextId FROM COB_T_LT_TEXTID_SO_RECOMPILE WHERE IsProcessed = 0))
UNION --Union Added by Yogesh
SELECT Op.Id,Op.OperationCode,Op.OperationRevision
FROM Function_Input Fi
INNER JOIN Text_Translation TT
ON ( TT.Textid = Fi.Prompttextid
AND TT.Active =1)
AND (TT.Short <> 'Null'
OR TT.Medium <> 'Null'
OR TT.Extended <> 'Null')
INNER JOIN Function_Input_Source_Type Fist
ON Fist.Id = Fi.Inputsourcetypeid
AND Fist.Active=1
INNER JOIN Text_Translation Ttdt
ON Ttdt.Textid = Fist.Textid
AND Ttdt.Active =1
AND Ttdt.Languageid = 1033
AND Upper(Ttdt.Extended) = 'USER'
INNER JOIN Function_ Fn
ON Fn.Id = Fi.Functionid
AND Fn.Active=1
INNER JOIN Function_Type Fnty
ON Fn.Functiontype=Fnty.Functiontype
AND Fnty.Active =1
INNER JOIN Operation_Step_Function Osf
ON Osf.Functionid=Fn.Id
AND Osf.Active =1
INNER JOIN Operation_Step Os
ON Os.Id = Osf.Operationstepid
AND Os.Active=1
INNER JOIN Operation Op
ON Op.Id = Os.Operationid
AND Op.Active =1
And Op.Revisionstatusid In (1,4)
INNER JOIN FUNCTION_INPUT_VALUE Fiv
ON Fi.id = Fiv.functionInputId AND Fiv.textid IS NOT NULL
AND TO_CHAR(Op.Id) IN (SELECT DISTINCT TO_CHAR(SUBSTR(FPV.PropertyValue,INSTR(FPV.PropertyValue, '<PropertyBagItem Key="OperationID"><Value xsi:type="xsd:int">')+61,9))
FROM
OPERATION OP
INNER JOIN OPERATION_STEP OS ON Op.Id = OS.OperationId
INNER JOIN OPERATION_STEP_FUNCTION OSF ON OS.Id = OSF.OperationStepId
INNER JOIN FUNCTION_ F ON OSF.FunctionId = F.id
AND F.FunctionType = 21
INNER JOIN FUNCTION_PROPERTY_VALUE FPV ON FPV.Functionid = F.Id
WHERE UPPER(OP.OperationRevision) = 'WRAPPER')
WHERE (Fiv.TextID IN (SELECT TextId FROM COB_T_LT_TEXTID_SO_RECOMPILE WHERE IsProcessed = 0 ) )
MINUS
(SELECT OperationId ,OperationCode,OperationRevision From COB_T_LANG_TRANS_OPERATION WHERE IsProcessed = 0)
DELETE FROM COB_T_LT_TEXTID_SO_RECOMPILE where IsProcessed = 0;
END;
END IF;
-- EXCEPTION
-- WHEN OTHERS THEN
-- ROLLBACK;
-- RAISE_APPLICATION_ERROR(-20660 , 'Concurrency violation. COB_T_LANG_TRANS_OPERATION table changed by another user in the meantime.');
END;
END;
END;
/
Do you remember this thread of yours? {message:id=10653623}
Well, you were asked to read various FAQs and to post certain information.
You haven't read and you didn't post the required information.
If you want people to make the effort to help you, you need to make the effort to post
the required information.
Similar Messages
-
Please help me to tune this PL/SQL...
Hi everyone,
I have a SQL query which runs ok when i run it individually but the same query if
i use it in a procedure.The procedure is hanging up.Could someone please help to tune this
SQL query and please check my procedure why is it hanging up.
SQL Query
=========
SELECT active_members.member_nbr,
active_members.name_last,
active_members.name_first,
active_members.name_middle,
active_members.dob,
active_members.sex,
active_members.subsciber_nbr,
active_members.ssn,
active_members.name_suffix,
active_members.class_x,
active_members.aff_nbr,
CASE
WHEN TRIM(active_members.class_x) = 'SE' THEN
(SELECT DISTINCT(mssp.member_nbr)
FROM member_span mssp
WHERE SUBSTR(mssp.member_nbr, 1, 9) = SUBSTR(active_members.member_nbr, 1, 9)
AND mssp.class_x = 'SP'
AND rownum = 1)
WHEN TRIM(active_members.class_x) = 'SP' THEN
(SELECT DISTINCT(mssp.member_nbr)
FROM member_span mssp
WHERE SUBSTR(mssp.member_nbr, 1, 9) = SUBSTR(active_members.member_nbr, 1, 9)
AND mssp.class_x = 'SE'
AND rownum = 1)
ELSE
NULL
END)
spouse_member_nbr,
active_members.division_nbr,
active_members.ymdeff,
active_members.ymdend,
active_members.actual_ymd_enddt,
active_members.email_id,
active_members.network_id,
active_members.insurance_company_code,
active_members.cob_flag,
active_members.vip_flag,
active_members.pre_x_flag,
active_members.region,
active_contracts.language_x,
active_contracts.corp_nbr,
active_members.group_nbr,
active_members.non_erisa_status
FROM
(SELECT mb_active.member_nbr,
mb_active.contract_nbr,
mb_active.name_last,
mb_active.name_first,
mb_active.name_middle,
ms_active.ymdeff,
ms_active.ymdend,
to_char(to_date(
CASE
WHEN LENGTH(mb_active.ymdbirth) = 8 THEN mb_active.ymdbirth
ELSE NULL
END, 'YYYYMMDD'), 'MM/DD/YYYY') dob,
mb_active.sex,
to_char(to_date(ms_active.ymdeff, 'YYYYMMDD'), 'MM/DD/YYYY') ymdeff_formatted,
to_char(to_date(ms_active.ymdend, 'YYYYMMDD'), 'MM/DD/YYYY') ymdend_formatted,
ms_active.void,
CASE
WHEN SUBSTR(mb_active.member_nbr, 10, 2) = '00' THEN mb_active.member_nbr
ELSE SUBSTR(mb_active.member_nbr, 1, 9) || '00'
END) subsciber_nbr,
mb_active.ssn,
mb_active.name_suffix,
ms_active.class_x,
ms_active.aff_nbr,
ms_active.division_nbr,
CASE
WHEN TRIM(ms_active.ymdend) = '99991231' THEN NULL
ELSE to_char(to_date(ms_active.ymdend, 'YYYYMMDD'), 'MM/DD/YYYY')
END) actual_ymd_enddt,
CASE
WHEN TRIM(ms_active.business_unit) = '01' THEN ms_active.business_unit || '-' || ms_active.prog_nbr
WHEN TRIM(ms_active.business_unit) = '03' THEN ms_active.business_unit || '-' || ms_active.prog_nbr || '-' || ms_active.carrier
ELSE NULL
END) network_id,
ms_active.business_unit || '-' || ms_active.prog_nbr || '-' || ms_active.carrier insurance_company_code,
(SELECT DISTINCT(email)
FROM dbo.av_mem_email
WHERE dbo.av_mem_email.member_nbr = mb_active.member_nbr
AND rownum = 1)
email_id,
mb_active.lr_response cob_flag,
mb_active.record_nbr vip_flag,
ms_active.pre_exist pre_x_flag,
ms_active.region region,
ms_active.group_nbr,
CASE
WHEN
(SELECT TRIM(div.div_status)
FROM division div
WHERE TRIM(div.division_nbr) = TRIM(ms_active.division_nbr)) = 'NULL' THEN
'Y'
ELSE
'N'
END)
non_erisa_status
FROM member mb_active,
member_span ms_active
WHERE mb_active.member_nbr = ms_active.member_nbr
AND(20090707 BETWEEN ms_active.ymdeff
AND ms_active.ymdend
AND TRIM(ms_active.void) IS NULL
active_members,
(SELECT DISTINCT(contract.contract_nbr),
contract.language_x,
contract_span.corp_nbr
FROM contract,
contract_span
WHERE contract.contract_nbr = contract_span.contract_nbr
AND(20090707 BETWEEN contract_span.ymdeff
AND contract_span.ymdend)
AND TRIM(contract_span.void) IS
NULL)
active_contracts
WHERE TRIM(active_members.contract_nbr) = TRIM(active_contracts.contract_nbr);
Taking around 6 minute to run and it returns """"268267"""" records
Explain Plan for the above SQL:
===============================
"PLAN_TABLE_OUTPUT"
"Plan hash value: 379550299"
"| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |"
"| 0 | SELECT STATEMENT | | 2609K| 659M| | 91679 (3)| 00:18:21 |"
"| 1 | HASH UNIQUE | | 1 | 16 | | 54461 (2)| 00:10:54 |"
"|* 2 | COUNT STOPKEY | | | | | | |"
"|* 3 | TABLE ACCESS FULL | MEMBER_SPAN | 12891 | 201K| | 54459 (2)| 00:10:54 |"
"| 4 | HASH UNIQUE | | 1 | 16 | 2424K| 54736 (2)| 00:10:57 |"
"|* 5 | COUNT STOPKEY | | | | | | |"
"|* 6 | TABLE ACCESS FULL | MEMBER_SPAN | 51541 | 805K| | 54459 (2)| 00:10:54 |"
"| 7 | HASH UNIQUE | | 1 | 50 | | 64 (4)| 00:00:01 |"
"|* 8 | COUNT STOPKEY | | | | | | |"
"|* 9 | TABLE ACCESS FULL | AV_MEM_EMAIL | 1 | 50 | | 63 (2)| 00:00:01 |"
"|* 10 | TABLE ACCESS FULL | DIVISION | 1 | 14 | | 3 (0)| 00:00:01 |"
"|* 11 | HASH JOIN | | 2609K| 659M| | 91679 (3)| 00:18:21 |"
"| 12 | VIEW | | 581 | 12782 | | 8184 (4)| 00:01:39 |"
"| 13 | HASH UNIQUE | | 581 | 26145 | | 8184 (4)| 00:01:39 |"
"| 14 | TABLE ACCESS BY INDEX ROWID| CONTRACT | 1 | 14 | | 2 (0)| 00:00:01 |"
"| 15 | NESTED LOOPS | | 581 | 26145 | | 8183 (4)| 00:01:39 |"
"|* 16 | TABLE ACCESS FULL | CONTRACT_SPAN | 581 | 18011 | | 7019 (5)| 00:01:25 |"
"|* 17 | INDEX RANGE SCAN | CONTRACT_IX1 | 1 | | | 1 (0)| 00:00:01 |"
"|* 18 | HASH JOIN | | 449K| 104M| 39M| 83466 (2)| 00:16:42 |"
"|* 19 | TABLE ACCESS FULL | MEMBER_SPAN | 449K| 34M| | 54964 (3)| 00:11:00 |"
"| 20 | TABLE ACCESS FULL | MEMBER | 1436K| 221M| | 14664 (2)| 00:02:56 |"
"Predicate Information (identified by operation id):"
" 2 - filter(ROWNUM=1)"
" 3 - filter(SUBSTR("MSSP"."MEMBER_NBR",1,9)=SUBSTR(:B1,1,9) AND "MSSP"."CLASS_X"='SP')"
" 5 - filter(ROWNUM=1)"
" 6 - filter(SUBSTR("MSSP"."MEMBER_NBR",1,9)=SUBSTR(:B1,1,9) AND "MSSP"."CLASS_X"='SE')"
" 8 - filter(ROWNUM=1)"
" 9 - filter("AV_MEM_EMAIL"."MEMBER_NBR"=:B1)"
" 10 - filter(TRIM("DIV"."DIVISION_NBR")=TRIM(:B1))"
" 11 - access(TRIM("MB_ACTIVE"."CONTRACT_NBR")=TRIM("ACTIVE_CONTRACTS"."CONTRACT_NBR"))"
" 16 - filter("CONTRACT_SPAN"."YMDEFF"<=20090707 AND TRIM("CONTRACT_SPAN"."VOID") IS NULL AND "
" "CONTRACT_SPAN"."YMDEND">=20090707)"
" 17 - access("CONTRACT"."CONTRACT_NBR"="CONTRACT_SPAN"."CONTRACT_NBR")"
" 18 - access("MB_ACTIVE"."MEMBER_NBR"="MS_ACTIVE"."MEMBER_NBR")"
" 19 - filter(TRIM("MS_ACTIVE"."VOID") IS NULL AND "MS_ACTIVE"."YMDEFF"<=20090707 AND "
" "MS_ACTIVE"."YMDEND">=20090707)"
SAME SQL IN A PROCEDURE..IT IS HANGING UP
========================================
create or replace PROCEDURE TEST_CURRENT_PCP_SPAN is
EXTRACTED_STRING VARCHAR2(32767);
FILEHANDLER UTL_FILE.FILE_TYPE;
test_str varchar2(100);
pcp_eff_date number(10);
file_name varchar2(50);
CURSOR MEMBERS
IS
SELECT active_members.member_nbr,
active_members.name_last,
active_members.name_first,
active_members.name_middle,
active_members.dob,
active_members.sex,
active_members.subsciber_nbr,
active_members.ssn,
active_members.name_suffix,
active_members.class_x,
active_members.aff_nbr,
CASE
WHEN TRIM(active_members.class_x) = 'SE' THEN
(SELECT DISTINCT(mssp.member_nbr)
FROM member_span mssp
WHERE SUBSTR(mssp.member_nbr, 1, 9) = SUBSTR(active_members.member_nbr, 1, 9)
AND mssp.class_x = 'SP'
AND rownum = 1)
WHEN TRIM(active_members.class_x) = 'SP' THEN
(SELECT DISTINCT(mssp.member_nbr)
FROM member_span mssp
WHERE SUBSTR(mssp.member_nbr, 1, 9) = SUBSTR(active_members.member_nbr, 1, 9)
AND mssp.class_x = 'SE'
AND rownum = 1)
ELSE
NULL
END)
spouse_member_nbr,
active_members.division_nbr,
active_members.ymdeff,
active_members.ymdend,
active_members.actual_ymd_enddt,
active_members.email_id,
active_members.network_id,
active_members.insurance_company_code,
active_members.cob_flag,
active_members.vip_flag,
active_members.pre_x_flag,
active_members.region,
active_contracts.language_x,
active_contracts.corp_nbr,
active_members.group_nbr,
active_members.non_erisa_status
FROM
(SELECT mb_active.member_nbr,
mb_active.contract_nbr,
mb_active.name_last,
mb_active.name_first,
mb_active.name_middle,
ms_active.ymdeff,
ms_active.ymdend,
to_char(to_date(
CASE
WHEN LENGTH(mb_active.ymdbirth) = 8 THEN mb_active.ymdbirth
ELSE NULL
END, 'YYYYMMDD'), 'MM/DD/YYYY') dob,
mb_active.sex,
to_char(to_date(ms_active.ymdeff, 'YYYYMMDD'), 'MM/DD/YYYY') ymdeff_formatted,
to_char(to_date(ms_active.ymdend, 'YYYYMMDD'), 'MM/DD/YYYY') ymdend_formatted,
ms_active.void,
CASE
WHEN SUBSTR(mb_active.member_nbr, 10, 2) = '00' THEN mb_active.member_nbr
ELSE SUBSTR(mb_active.member_nbr, 1, 9) || '00'
END) subsciber_nbr,
mb_active.ssn,
mb_active.name_suffix,
ms_active.class_x,
ms_active.aff_nbr,
ms_active.division_nbr,
CASE
WHEN TRIM(ms_active.ymdend) = '99991231' THEN NULL
ELSE to_char(to_date(ms_active.ymdend, 'YYYYMMDD'), 'MM/DD/YYYY')
END) actual_ymd_enddt,
CASE
WHEN TRIM(ms_active.business_unit) = '01' THEN ms_active.business_unit || '-' || ms_active.prog_nbr
WHEN TRIM(ms_active.business_unit) = '03' THEN ms_active.business_unit || '-' || ms_active.prog_nbr || '-' || ms_active.carrier
ELSE NULL
END) network_id,
ms_active.business_unit || '-' || ms_active.prog_nbr || '-' || ms_active.carrier insurance_company_code,
(SELECT DISTINCT(email)
FROM dbo.av_mem_email
WHERE dbo.av_mem_email.member_nbr = mb_active.member_nbr
AND rownum = 1)
email_id,
mb_active.lr_response cob_flag,
mb_active.record_nbr vip_flag,
ms_active.pre_exist pre_x_flag,
ms_active.region region,
ms_active.group_nbr,
CASE
WHEN
(SELECT TRIM(div.div_status)
FROM division div
WHERE TRIM(div.division_nbr) = TRIM(ms_active.division_nbr)) = 'NULL' THEN
'Y'
ELSE
'N'
END)
non_erisa_status
FROM member mb_active,
member_span ms_active
WHERE mb_active.member_nbr = ms_active.member_nbr
AND(20090707 BETWEEN ms_active.ymdeff
AND ms_active.ymdend
AND TRIM(ms_active.void) IS NULL
active_members,
(SELECT DISTINCT(contract.contract_nbr),
contract.language_x,
contract_span.corp_nbr
FROM contract,
contract_span
WHERE contract.contract_nbr = contract_span.contract_nbr
AND(20090707 BETWEEN contract_span.ymdeff
AND contract_span.ymdend)
AND TRIM(contract_span.void) IS
NULL)
active_contracts
WHERE TRIM(active_members.contract_nbr) = TRIM(active_contracts.contract_nbr);
TYPE MEM IS TABLE OF MEMBERS%ROWTYPE INDEX BY PLS_INTEGER;
TABLE_MEM MEM;
MEMBER_ADDR MGONZALEZ.CPKG_UTIL.ADDR;
BEGIN
test_str := '''A10000213'''||','||'''A10000213''';
insert into test_number_char(str) values ('start time of MEMBER_LOAD_CURRENT_PCP_SPAN '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
commit;
file_name := 'member_load'||to_char(sysdate,'YYYYMMDDHH24MI')||'.txt';
FILEHANDLER := UTL_FILE.FOPEN('AVMED_UTL_FILE',file_name, 'W',10000);
insert into test_number_char(str) values ('start time of opening members cursor(before open members command) '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
commit;
OPEN MEMBERS;
LOOP
FETCH MEMBERS
BULK COLLECT INTO TABLE_MEM LIMIT 1000 ;
EXIT WHEN TABLE_MEM.COUNT = 0;
insert into test_number_char(str) values ('start time of outer loop '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
commit;
FOR i IN 1 .. TABLE_MEM.COUNT
LOOP
EXTRACTED_STRING := TRIM(TABLE_MEM(i).MEMBER_NBR)||'| '||
TRIM(TABLE_MEM(i).NAME_LAST)||'| '||
TRIM(TABLE_MEM(i).NAME_FIRST)||'| '||
TRIM(TABLE_MEM(i).NAME_MIDDLE)||'| '||
TRIM(TABLE_MEM(i).ssn)||'| '||
TABLE_MEM(i).subsciber_nbr||'| '||
TRIM(TABLE_MEM(i).class_x)||'| '||
TRIM(TABLE_MEM(i).DOB)||'| '||
TRIM(TABLE_MEM(i).SEX)||'| ' ;
EXTRACTED_STRING :=
EXTRACTED_STRING ||
TRIM(TABLE_MEM(i).aff_nbr)||'| '||
pcp_eff_date||'| '||
TABLE_MEM(i).actual_ymd_enddt||'| '||
TRIM(TABLE_MEM(i).division_nbr)||'| '||
' '||'| '||
' '||'| '||
' '||'| '||
TABLE_MEM(i).network_id||'| '||
' '||'| '||
' '||'| '||
' '||'| '||
' '||'| '||
' '||'| '||
TRIM(TABLE_MEM(i).name_suffix)||'| '||
' '||'| '||
TRIM(TABLE_MEM(i).spouse_member_nbr)||'| '||
' '||'| '||
' '||'| '||
' '||'| '||
' '||'| '||
' '||'| '||
' '||'| '||
' '||'| '||
' '||'| '||
' '||'| '||
' '||'| '||
' '||'| '||
' '||'| '||
' '||'| '||
TRIM(TABLE_MEM(i).email_id)||'| '||
TABLE_MEM(i).Insurance_company_code||'| '||
TABLE_MEM(i).group_nbr||'| '||
TABLE_MEM(i).language_x||'| '||
TABLE_MEM(i).region||'| '||
TABLE_MEM(i).corp_nbr||'| '||
TABLE_MEM(i).non_erisa_status||'| '||
TABLE_MEM(i).cob_flag||'| '||
TABLE_MEM(i).pre_x_flag||'| '||
TABLE_MEM(i).vip_flag
EXTRACTED_STRING := rtrim(EXTRACTED_STRING,' ');
UTL_FILE.PUT_LINE(FILEHANDLER,EXTRACTED_STRING,TRUE);
EXTRACTED_STRING := NULL;
pcp_eff_date := NULL;
END LOOP;
insert into test_number_char(str) values ('end time of outer loop '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
commit;
END LOOP;
close members;
insert into test_number_char(str) values ('end time of opening members cursor '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
commit;
commit;
UTL_FILE.FCLOSE(FILEHANDLER);
insert into test_number_char(str) values ('End time of MEMBER_LOAD_CURRENT_PCP_SPAN '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
commit;
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.put_line( 'ERROR getting members '
|| SQLCODE
|| ' '
|| SQLERRM);
END ;
In my Test table which i am inserting to check the times...
I am geting on these 2 records after that it hangs up...
start time of MEMBER_LOAD_CURRENT_PCP_SPAN 07/08/2009 11:41:21
start time of opening members cursor(before open members command) 07/08/2009 11:41:21I have to call some other functions for each member to get additional details thats the reason i am going for Procedure.Instead it is just a simple SQL
Thanks in advanceIt is taking lot of timeYou could perhaps split it up in smaller, isolated parts.
Running certain steps separate.
..is it possible to find out the issues without running the proc?Other than have other people on OTN give their ideas/share experiences?
Not that I'm aware of.
There are lots of statistical views, you might be able to deduct from their data, but I personally prefer running the procedure and just trace it. But I'm always willing to learn new approaches, btw.
Still, you have 2 things to look at, at least:
- avoid loops in loops if possible
- check your predicates, if you apply a function, you lose the index, unless you create a function based index.
edit
One more thing (how could I overlook that):
You commit your instrumentation code ( insert into test_number_char(str) ) IN the loop.
Please remove commit in your loops...
Commit only once, at the end of your transaction.
Never commit in a loop.
(Preferrably the client commits)
And remove every commit in your loop...
Edited by: hoek on Jul 8, 2009 8:03 PM -
Sql Query Tuning. Please help me to tune this query
Hi All ,
I have this problematic Sql . It is taking huge time to execute. It contains a view CIDV, which i think is the bottleneck.
I have pasted the query below. I will be pasting TKPROF and explain plan for the same. Please advice me to tune this query.
SELECT GCC.SEGMENT1 || '.' || GCC.SEGMENT2 || '.' || GCC.SEGMENT3 || '.' ||
GCC.SEGMENT4 || '.' || GCC.SEGMENT5 || '.' || GCC.SEGMENT6 || '.' ||
GCC.SEGMENT7 || '.' || GCC.SEGMENT8 || '.' || GCC.SEGMENT9 OFFSET_ACCOUNT,
OOD.ORGANIZATION_CODE,
CIDV.SUBINVENTORY_CODE OFFSET_SUBINV,
MIL.SEGMENT1 || '.' || MIL.SEGMENT2 || '.' || MIL.SEGMENT3 || '.' ||
MIL.SEGMENT4 || '.' || MIL.SEGMENT5 OFFSET_LOCATOR,
CIDV.LAST_UPDATE_LOGIN
FROM APPS.CST_INV_DISTRIBUTION_V CIDV,
APPS.GL_CODE_COMBINATIONS GCC,
APPS.MTL_ITEM_LOCATIONS MIL,
APPS.ORG_ORGANIZATION_DEFINITIONS OOD
WHERE CIDV.TRANSACTION_ID = :B2
AND CIDV.PRIMARY_QUANTITY = (-1) * :B1
AND CIDV.REFERENCE_ACCOUNT = GCC.CODE_COMBINATION_ID
AND OOD.ORGANIZATION_ID = CIDV.ORGANIZATION_ID
AND MIL.INVENTORY_LOCATION_ID = CIDV.LOCATOR_ID
AND GCC.ACCOUNT_TYPE = 'A'****************
TKPROF
call count cpu elapsed disk query current rows
Parse 1 0.00 0.00 0 0 0 0
Execute 68337 10.32 10.32 0 0 0 0
Fetch 68337 229.75 936.36 58819 6743323 1121 68232
total 136675 240.07 946.69 58819 6743323 1121 68232
Misses in library cache during parse: 1
Misses in library cache during execute: 1
Optimizer mode: ALL_ROWS
Parsing user id: 203 (recursive depth: 1)
Number of plan statistics captured: 1
Rows (1st) Rows (avg) Rows (max) Row Source Operation
1 1 1 MERGE JOIN CARTESIAN (cr=102 pr=15 pw=0 time=193608 us cost=56 size=219 card=1)
1 1 1 NESTED LOOPS (cr=100 pr=15 pw=0 time=193483 us cost=53 size=219 card=1)
1 1 1 NESTED LOOPS (cr=99 pr=15 pw=0 time=193407 us cost=52 size=215 card=1)
1 1 1 NESTED LOOPS (cr=96 pr=15 pw=0 time=193378 us cost=51 size=190 card=1)
1 1 1 NESTED LOOPS (cr=93 pr=15 pw=0 time=193284 us cost=49 size=162 card=1)
1 1 1 NESTED LOOPS (cr=89 pr=14 pw=0 time=185515 us cost=46 size=138 card=1)
1 1 1 NESTED LOOPS (cr=85 pr=12 pw=0 time=157975 us cost=44 size=81 card=1)
1 1 1 NESTED LOOPS (cr=83 pr=12 pw=0 time=157925 us cost=43 size=73 card=1)
1 1 1 NESTED LOOPS (cr=81 pr=12 pw=0 time=157641 us cost=43 size=132 card=2)
1 1 1 VIEW CST_INV_DISTRIBUTION_V (cr=78 pr=12 pw=0 time=156386 us cost=41 size=118 card=2)
1 1 1 UNION-ALL (cr=78 pr=12 pw=0 time=156378 us)
0 0 0 NESTED LOOPS OUTER (cr=44 pr=9 pw=0 time=124997 us cost=20 size=291 card=1)
0 0 0 NESTED LOOPS (cr=44 pr=9 pw=0 time=124993 us cost=18 size=255 card=1)
0 0 0 NESTED LOOPS (cr=44 pr=9 pw=0 time=124990 us cost=18 size=251 card=1)
33 33 33 MERGE JOIN CARTESIAN (cr=25 pr=6 pw=0 time=98544 us cost=14 size=192 card=1)
1 1 1 NESTED LOOPS OUTER (cr=22 pr=5 pw=0 time=85754 us cost=12 size=156 card=1)
1 1 1 NESTED LOOPS (cr=19 pr=4 pw=0 time=79830 us cost=10 size=120 card=1)
1 1 1 NESTED LOOPS OUTER (cr=17 pr=4 pw=0 time=79813 us cost=9 size=113 card=1)
1 1 1 NESTED LOOPS (cr=15 pr=4 pw=0 time=79752 us cost=8 size=106 card=1)
1 1 1 NESTED LOOPS (cr=11 pr=2 pw=0 time=43120 us cost=6 size=93 card=1)
1 1 1 NESTED LOOPS (cr=7 pr=2 pw=0 time=43087 us cost=4 size=83 card=1)
1 1 1 NESTED LOOPS (cr=6 pr=2 pw=0 time=43072 us cost=4 size=80 card=1)
1 1 1 TABLE ACCESS BY INDEX ROWID MTL_MATERIAL_TRANSACTIONS (cr=5 pr=2 pw=0 time=43042 us cost=4 size=76 card=1)
1 1 1 INDEX UNIQUE SCAN MTL_MATERIAL_TRANSACTIONS_U1 (cr=4 pr=2 pw=0 time=43011 us cost=3 size=0 card=1)(object id 12484094)
1 1 1 INDEX UNIQUE SCAN MTL_TRANSACTION_TYPES_U1 (cr=1 pr=0 pw=0 time=20 us cost=0 size=764 card=191)(object id 9983)
1 1 1 INDEX UNIQUE SCAN MTL_TXN_SOURCE_TYPES_U1 (cr=1 pr=0 pw=0 time=7 us cost=0 size=54 card=18)(object id 9987)
1 1 1 INDEX UNIQUE SCAN MTL_SYSTEM_ITEMS_B_U1 (cr=4 pr=0 pw=0 time=27 us cost=2 size=736324450 card=73632445)(object id 12484155)
1 1 1 INDEX UNIQUE SCAN MTL_SYSTEM_ITEMS_TL_U1 (cr=4 pr=2 pw=0 time=36626 us cost=2 size=957481070 card=73652390)(object id 12484137)
1 1 1 TABLE ACCESS BY INDEX ROWID MTL_PARAMETERS (cr=2 pr=0 pw=0 time=42 us cost=1 size=3290 card=470)
1 1 1 INDEX UNIQUE SCAN MTL_PARAMETERS_U1 (cr=1 pr=0 pw=0 time=28 us cost=0 size=0 card=1)(object id 9847)
1 1 1 TABLE ACCESS BY INDEX ROWID MTL_PARAMETERS (cr=2 pr=0 pw=0 time=12 us cost=1 size=3290 card=470)
1 1 1 INDEX UNIQUE SCAN MTL_PARAMETERS_U1 (cr=1 pr=0 pw=0 time=7 us cost=0 size=0 card=1)(object id 9847)
0 0 0 INDEX RANGE SCAN FND_LOOKUP_VALUES_U1 (cr=3 pr=1 pw=0 time=5915 us cost=2 size=36 card=1)(object id 705891)
33 33 33 BUFFER SORT (cr=3 pr=1 pw=0 time=12713 us cost=12 size=36 card=1)
33 33 33 INDEX RANGE SCAN FND_LOOKUP_VALUES_U1 (cr=3 pr=1 pw=0 time=12582 us cost=2 size=36 card=1)(object id 705891)
0 0 0 TABLE ACCESS BY INDEX ROWID MTL_TRANSACTION_ACCOUNTS (cr=19 pr=3 pw=0 time=26591 us cost=4 size=59 card=1)
66 66 66 INDEX RANGE SCAN MTL_TRANSACTION_ACCOUNTS_N1 (cr=18 pr=2 pw=0 time=13607 us cost=3 size=0 card=3)(object id 12484127)
0 0 0 INDEX UNIQUE SCAN MTL_PARAMETERS_U1 (cr=0 pr=0 pw=0 time=0 us cost=0 size=4 card=1)(object id 9847)
0 0 0 INDEX RANGE SCAN FND_LOOKUP_VALUES_U1 (cr=0 pr=0 pw=0 time=0 us cost=2 size=36 card=1)(object id 705891)
1 1 1 NESTED LOOPS (cr=34 pr=3 pw=0 time=31269 us cost=21 size=288 card=1)
1 1 1 NESTED LOOPS (cr=30 pr=3 pw=0 time=31161 us cost=19 size=275 card=1)
1 1 1 NESTED LOOPS (cr=26 pr=3 pw=0 time=31105 us cost=17 size=265 card=1)
1 1 1 NESTED LOOPS (cr=25 pr=3 pw=0 time=31082 us cost=17 size=261 card=1)
1 1 1 NESTED LOOPS OUTER (cr=23 pr=3 pw=0 time=31027 us cost=16 size=254 card=1)
1 1 1 NESTED LOOPS (cr=21 pr=3 pw=0 time=30980 us cost=15 size=247 card=1)
1 1 1 NESTED LOOPS (cr=20 pr=3 pw=0 time=30957 us cost=15 size=243 card=1)
1 1 1 NESTED LOOPS OUTER (cr=19 pr=3 pw=0 time=30926 us cost=15 size=240 card=1)
1 1 1 NESTED LOOPS (cr=16 pr=3 pw=0 time=30389 us cost=13 size=204 card=1)
1 1 1 NESTED LOOPS (cr=11 pr=0 pw=0 time=665 us cost=9 size=131 card=1)
1 1 1 NESTED LOOPS OUTER (cr=8 pr=0 pw=0 time=306 us cost=7 size=95 card=1)
1 1 1 TABLE ACCESS BY INDEX ROWID MTL_TRANSACTION_ACCOUNTS (cr=5 pr=0 pw=0 time=37 us cost=5 size=59 card=1)
2 2 2 INDEX RANGE SCAN MTL_TRANSACTION_ACCOUNTS_N1 (cr=4 pr=0 pw=0 time=17 us cost=4 size=0 card=3)(object id 12484127)
1 1 1 INDEX RANGE SCAN FND_LOOKUP_VALUES_U1 (cr=3 pr=0 pw=0 time=216 us cost=2 size=36 card=1)(object id 705891)
1 1 1 INDEX RANGE SCAN FND_LOOKUP_VALUES_U1 (cr=3 pr=0 pw=0 time=352 us cost=2 size=36 card=1)(object id 705891)
1 1 1 TABLE ACCESS BY INDEX ROWID MTL_MATERIAL_TRANSACTIONS (cr=5 pr=3 pw=0 time=29716 us cost=4 size=73 card=1)
1 1 1 INDEX RANGE SCAN MTL_MATERIAL_TRANSACTIONS_N23 (cr=4 pr=3 pw=0 time=29588 us cost=3 size=0 card=1)(object id 12484133)
0 0 0 INDEX RANGE SCAN FND_LOOKUP_VALUES_U1 (cr=3 pr=0 pw=0 time=520 us cost=2 size=36 card=1)(object id 705891)
1 1 1 INDEX UNIQUE SCAN MTL_TXN_SOURCE_TYPES_U1 (cr=1 pr=0 pw=0 time=22 us cost=0 size=3 card=1)(object id 9987)
1 1 1 INDEX UNIQUE SCAN MTL_TRANSACTION_TYPES_U1 (cr=1 pr=0 pw=0 time=16 us cost=0 size=4 card=1)(object id 9983)
1 1 1 TABLE ACCESS BY INDEX ROWID MTL_PARAMETERS (cr=2 pr=0 pw=0 time=34 us cost=1 size=7 card=1)
1 1 1 INDEX UNIQUE SCAN MTL_PARAMETERS_U1 (cr=1 pr=0 pw=0 time=19 us cost=0 size=0 card=1)(object id 9847)
1 1 1 TABLE ACCESS BY INDEX ROWID MTL_PARAMETERS (cr=2 pr=0 pw=0 time=44 us cost=1 size=7 card=1)
1 1 1 INDEX UNIQUE SCAN MTL_PARAMETERS_U1 (cr=1 pr=0 pw=0 time=14 us cost=0 size=0 card=1)(object id 9847)
1 1 1 INDEX UNIQUE SCAN MTL_PARAMETERS_U1 (cr=1 pr=0 pw=0 time=13 us cost=0 size=4 card=1)(object id 9847)
1 1 1 INDEX UNIQUE SCAN MTL_SYSTEM_ITEMS_B_U1 (cr=4 pr=0 pw=0 time=49 us cost=2 size=10 card=1)(object id 12484155)
1 1 1 INDEX UNIQUE SCAN MTL_SYSTEM_ITEMS_TL_U1 (cr=4 pr=0 pw=0 time=96 us cost=2 size=13 card=1)(object id 12484137)
1 1 1 TABLE ACCESS BY INDEX ROWID HR_ALL_ORGANIZATION_UNITS (cr=3 pr=0 pw=0 time=1246 us cost=1 size=7 card=1)
1 1 1 INDEX UNIQUE SCAN HR_ORGANIZATION_UNITS_PK (cr=2 pr=0 pw=0 time=24 us cost=0 size=0 card=1)(object id 250158)
1 1 1 INDEX UNIQUE SCAN HR_ALL_ORGANIZATION_UNTS_TL_PK (cr=2 pr=0 pw=0 time=275 us cost=0 size=7 card=1)(object id 689101)
1 1 1 TABLE ACCESS BY INDEX ROWID MTL_PARAMETERS (cr=2 pr=0 pw=0 time=38 us cost=1 size=8 card=1)
1 1 1 INDEX UNIQUE SCAN MTL_PARAMETERS_U1 (cr=1 pr=0 pw=0 time=15 us cost=0 size=0 card=1)(object id 9847)
1 1 1 TABLE ACCESS BY INDEX ROWID GL_CODE_COMBINATIONS (cr=4 pr=2 pw=0 time=27531 us cost=2 size=57 card=1)
1 1 1 INDEX UNIQUE SCAN GL_CODE_COMBINATIONS_U1 (cr=3 pr=1 pw=0 time=19925 us cost=1 size=0 card=1)(object id 51426)
1 1 1 TABLE ACCESS BY INDEX ROWID MTL_ITEM_LOCATIONS (cr=4 pr=1 pw=0 time=7758 us cost=3 size=24 card=1)
1 1 1 INDEX RANGE SCAN MTL_ITEM_LOCATIONS_U1 (cr=3 pr=0 pw=0 time=51 us cost=2 size=0 card=1)(object id 9761)
1 1 1 TABLE ACCESS BY INDEX ROWID HR_ORGANIZATION_INFORMATION (cr=3 pr=0 pw=0 time=85 us cost=2 size=28 card=1)
1 1 1 INDEX RANGE SCAN HR_ORGANIZATION_INFORMATIO_FK2 (cr=2 pr=0 pw=0 time=29 us cost=1 size=0 card=2)(object id 5379798)
1 1 1 TABLE ACCESS BY INDEX ROWID HR_ORGANIZATION_INFORMATION (cr=3 pr=0 pw=0 time=25 us cost=1 size=25 card=1)
1 1 1 INDEX RANGE SCAN HR_ORGANIZATION_INFORMATIO_FK2 (cr=2 pr=0 pw=0 time=11 us cost=1 size=0 card=1)(object id 5379798)
1 1 1 INDEX FULL SCAN GL_SETS_OF_BOOKS_U2 (cr=1 pr=0 pw=0 time=69 us cost=1 size=4 card=1)(object id 1380842)
1 1 1 BUFFER SORT (cr=2 pr=0 pw=0 time=110 us cost=55 size=0 card=1)
1 1 1 TABLE ACCESS FULL FND_PRODUCT_GROUPS (cr=2 pr=0 pw=0 time=59 us cost=3 size=0 card=1)
Elapsed times include waiting on following events:
Event waited on Times Max. Wait Total Waited
---------------------------------------- Waited ---------- ------------
library cache lock 2 0.00 0.00
library cache pin 2 0.00 0.00
Disk file operations I/O 249 0.00 0.00
db file sequential read 58819 2.61 714.28
gc cr grant 2-way 5198 0.16 4.52
gc current grant busy 1 0.00 0.00
KJC: Wait for msg sends to complete 517 0.00 0.05
library cache: mutex X 433 0.01 0.04
gc cr grant congested 28 0.08 0.18
latch: ges resource hash list 5 0.00 0.00
gc current block 2-way 513 0.11 0.61
gc current block congested 2 0.00 0.00
latch: gc element 16 0.00 0.01
latch: cache buffers chains 4 0.00 0.00
latch: object queue header operation 3 0.00 0.00
********************************************************************************Explain Plan for the query
SELECT STATEMENT, GOAL = ALL_ROWS Cost=56 Cardinality=1 Bytes=219
MERGE JOIN CARTESIAN Cost=56 Cardinality=1 Bytes=219
NESTED LOOPS Cost=53 Cardinality=1 Bytes=219
NESTED LOOPS Cost=52 Cardinality=1 Bytes=215
NESTED LOOPS Cost=51 Cardinality=1 Bytes=190
NESTED LOOPS Cost=49 Cardinality=1 Bytes=162
NESTED LOOPS Cost=46 Cardinality=1 Bytes=138
NESTED LOOPS Cost=44 Cardinality=1 Bytes=81
NESTED LOOPS Cost=43 Cardinality=1 Bytes=73
NESTED LOOPS Cost=43 Cardinality=2 Bytes=132
VIEW Object owner=APPS Object name=CST_INV_DISTRIBUTION_V Cost=41 Cardinality=2 Bytes=118
UNION-ALL
NESTED LOOPS OUTER Cost=20 Cardinality=1 Bytes=291
NESTED LOOPS Cost=18 Cardinality=1 Bytes=255
NESTED LOOPS Cost=18 Cardinality=1 Bytes=251
MERGE JOIN CARTESIAN Cost=14 Cardinality=1 Bytes=192
NESTED LOOPS OUTER Cost=12 Cardinality=1 Bytes=156
NESTED LOOPS Cost=10 Cardinality=1 Bytes=120
NESTED LOOPS OUTER Cost=9 Cardinality=1 Bytes=113
NESTED LOOPS Cost=8 Cardinality=1 Bytes=106
NESTED LOOPS Cost=6 Cardinality=1 Bytes=93
NESTED LOOPS Cost=4 Cardinality=1 Bytes=83
NESTED LOOPS Cost=4 Cardinality=1 Bytes=80
TABLE ACCESS BY INDEX ROWID Object owner=INV Object name=MTL_MATERIAL_TRANSACTIONS Cost=4 Cardinality=1 Bytes=76
INDEX UNIQUE SCAN Object owner=INV Object name=MTL_MATERIAL_TRANSACTIONS_U1 Cost=3 Cardinality=1
INDEX UNIQUE SCAN Object owner=INV Object name=MTL_TRANSACTION_TYPES_U1 Cost=0 Cardinality=191 Bytes=764
INDEX UNIQUE SCAN Object owner=INV Object name=MTL_TXN_SOURCE_TYPES_U1 Cost=0 Cardinality=18 Bytes=54
INDEX UNIQUE SCAN Object owner=INV Object name=MTL_SYSTEM_ITEMS_B_U1 Cost=2 Cardinality=73632445 Bytes=736324450
INDEX UNIQUE SCAN Object owner=INV Object name=MTL_SYSTEM_ITEMS_TL_U1 Cost=2 Cardinality=73652390 Bytes=957481070
TABLE ACCESS BY INDEX ROWID Object owner=INV Object name=MTL_PARAMETERS Cost=1 Cardinality=470 Bytes=3290
INDEX UNIQUE SCAN Object owner=INV Object name=MTL_PARAMETERS_U1 Cost=0 Cardinality=1
TABLE ACCESS BY INDEX ROWID Object owner=INV Object name=MTL_PARAMETERS Cost=1 Cardinality=470 Bytes=3290
INDEX UNIQUE SCAN Object owner=INV Object name=MTL_PARAMETERS_U1 Cost=0 Cardinality=1
INDEX RANGE SCAN Object owner=APPLSYS Object name=FND_LOOKUP_VALUES_U1 Cost=2 Cardinality=1 Bytes=36
BUFFER SORT Cost=12 Cardinality=1 Bytes=36
INDEX RANGE SCAN Object owner=APPLSYS Object name=FND_LOOKUP_VALUES_U1 Cost=2 Cardinality=1 Bytes=36
TABLE ACCESS BY INDEX ROWID Object owner=INV Object name=MTL_TRANSACTION_ACCOUNTS Cost=4 Cardinality=1 Bytes=59
INDEX RANGE SCAN Object owner=INV Object name=MTL_TRANSACTION_ACCOUNTS_N1 Cost=3 Cardinality=3
INDEX UNIQUE SCAN Object owner=INV Object name=MTL_PARAMETERS_U1 Cost=0 Cardinality=1 Bytes=4
INDEX RANGE SCAN Object owner=APPLSYS Object name=FND_LOOKUP_VALUES_U1 Cost=2 Cardinality=1 Bytes=36
NESTED LOOPS Cost=21 Cardinality=1 Bytes=288
NESTED LOOPS Cost=19 Cardinality=1 Bytes=275
NESTED LOOPS Cost=17 Cardinality=1 Bytes=265
NESTED LOOPS Cost=17 Cardinality=1 Bytes=261
NESTED LOOPS OUTER Cost=16 Cardinality=1 Bytes=254
NESTED LOOPS Cost=15 Cardinality=1 Bytes=247
NESTED LOOPS Cost=15 Cardinality=1 Bytes=243
NESTED LOOPS OUTER Cost=15 Cardinality=1 Bytes=240
NESTED LOOPS Cost=13 Cardinality=1 Bytes=204
NESTED LOOPS Cost=9 Cardinality=1 Bytes=131
NESTED LOOPS OUTER Cost=7 Cardinality=1 Bytes=95
TABLE ACCESS BY INDEX ROWID Object owner=INV Object name=MTL_TRANSACTION_ACCOUNTS Cost=5 Cardinality=1 Bytes=59
INDEX RANGE SCAN Object owner=INV Object name=MTL_TRANSACTION_ACCOUNTS_N1 Cost=4 Cardinality=3
INDEX RANGE SCAN Object owner=APPLSYS Object name=FND_LOOKUP_VALUES_U1 Cost=2 Cardinality=1 Bytes=36
INDEX RANGE SCAN Object owner=APPLSYS Object name=FND_LOOKUP_VALUES_U1 Cost=2 Cardinality=1 Bytes=36
TABLE ACCESS BY INDEX ROWID Object owner=INV Object name=MTL_MATERIAL_TRANSACTIONS Cost=4 Cardinality=1 Bytes=73
INDEX RANGE SCAN Object owner=INV Object name=MTL_MATERIAL_TRANSACTIONS_N23 Cost=3 Cardinality=1
INDEX RANGE SCAN Object owner=APPLSYS Object name=FND_LOOKUP_VALUES_U1 Cost=2 Cardinality=1 Bytes=36
INDEX UNIQUE SCAN Object owner=INV Object name=MTL_TXN_SOURCE_TYPES_U1 Cost=0 Cardinality=1 Bytes=3
INDEX UNIQUE SCAN Object owner=INV Object name=MTL_TRANSACTION_TYPES_U1 Cost=0 Cardinality=1 Bytes=4
TABLE ACCESS BY INDEX ROWID Object owner=INV Object name=MTL_PARAMETERS Cost=1 Cardinality=1 Bytes=7
INDEX UNIQUE SCAN Object owner=INV Object name=MTL_PARAMETERS_U1 Cost=0 Cardinality=1
TABLE ACCESS BY INDEX ROWID Object owner=INV Object name=MTL_PARAMETERS Cost=1 Cardinality=1 Bytes=7
INDEX UNIQUE SCAN Object owner=INV Object name=MTL_PARAMETERS_U1 Cost=0 Cardinality=1
INDEX UNIQUE SCAN Object owner=INV Object name=MTL_PARAMETERS_U1 Cost=0 Cardinality=1 Bytes=4
INDEX UNIQUE SCAN Object owner=INV Object name=MTL_SYSTEM_ITEMS_B_U1 Cost=2 Cardinality=1 Bytes=10
INDEX UNIQUE SCAN Object owner=INV Object name=MTL_SYSTEM_ITEMS_TL_U1 Cost=2 Cardinality=1 Bytes=13
TABLE ACCESS BY INDEX ROWID Object owner=HR Object name=HR_ALL_ORGANIZATION_UNITS Cost=1 Cardinality=1 Bytes=7
INDEX UNIQUE SCAN Object owner=HR Object name=HR_ORGANIZATION_UNITS_PK Cost=0 Cardinality=1
INDEX UNIQUE SCAN Object owner=HR Object name=HR_ALL_ORGANIZATION_UNTS_TL_PK Cost=0 Cardinality=1 Bytes=7
TABLE ACCESS BY INDEX ROWID Object owner=INV Object name=MTL_PARAMETERS Cost=1 Cardinality=1 Bytes=8
INDEX UNIQUE SCAN Object owner=INV Object name=MTL_PARAMETERS_U1 Cost=0 Cardinality=1
TABLE ACCESS BY INDEX ROWID Object owner=GL Object name=GL_CODE_COMBINATIONS Cost=2 Cardinality=1 Bytes=57
INDEX UNIQUE SCAN Object owner=GL Object name=GL_CODE_COMBINATIONS_U1 Cost=1 Cardinality=1
TABLE ACCESS BY INDEX ROWID Object owner=INV Object name=MTL_ITEM_LOCATIONS Cost=3 Cardinality=1 Bytes=24
INDEX RANGE SCAN Object owner=INV Object name=MTL_ITEM_LOCATIONS_U1 Cost=2 Cardinality=1
TABLE ACCESS BY INDEX ROWID Object owner=HR Object name=HR_ORGANIZATION_INFORMATION Cost=2 Cardinality=1 Bytes=28
INDEX RANGE SCAN Object owner=HR Object name=HR_ORGANIZATION_INFORMATIO_FK2 Cost=1 Cardinality=2
TABLE ACCESS BY INDEX ROWID Object owner=HR Object name=HR_ORGANIZATION_INFORMATION Cost=1 Cardinality=1 Bytes=25
INDEX RANGE SCAN Object owner=HR Object name=HR_ORGANIZATION_INFORMATIO_FK2 Cost=1 Cardinality=1
INDEX FULL SCAN Object owner=GL Object name=GL_SETS_OF_BOOKS_U2 Cost=1 Cardinality=1 Bytes=4
BUFFER SORT Cost=55 Cardinality=1
TABLE ACCESS FULL Object owner=APPLSYS Object name=FND_PRODUCT_GROUPS Cost=3 Cardinality=1 -
Getting error while compiling this pl/sql code
Hi,
I am trying to execute the below block of pl/sql code and i encountering an error. i tried all possible combination of paranthesis and quotes. still giving error. can someone please help?
IF inserting THEN
pk_imdb_audit.p_ins_characteristic_a_t
(in_'||rpad(column_name,35,' ')||'=> pk_imdb_audit.v_action_inserting,'
WHEN max_col = column_id THEN
in_'||rpad(column_name,35,' ')||'=> '||lower(in_col_value)||');'
ELSE
' in_'||rpad(column_name,35,' ')||'=> '||lower(in_col_value)||','
END text,
table_name,
column_id,
2 disp_ord
error snapshot:-
ORA-06550: line 14, column 14:
PLS-00103: Encountered the symbol "||rpad(column_name,35," when expecting one of the following:
. ( ) , * @ % & | = - + < / > at in is mod remainder not
range rem => .. <an exponent (**)> <> or != or ~= >= <= <>
and or like LIKE2_ LIKE4_ LIKEC_ as between from using ||
multiset member SUBMULTISET_
The symbol "( was inserted before "||rpad(column_name,35," to continue.
ORA-06550: line 15, column 13:
PLS-00103: Encountered the symbol "WHEN" when expecting one of thHi,
here is a 'parseable' version of your query, but there is numerous ways to improve what you want to do (not sure even if the query is giving you what you're expecting from it):
SELECT text
FROM (SELECT (CASE
WHEN min_col = max_col THEN 'CREATE OR REPLACE TRIGGER '
|| SUBSTR(column_name,
1,
4
|| 'aud
AFTER INSERT
OR UPDATE
OF '
|| column_name
|| ',
OR DELETE ON imdb.'
|| table_name
|| '
FOR EACH ROW'
ELSE(CASE
WHEN min_col = column_id THEN 'CREATE OR REPLACE TRIGGER '
|| SUBSTR(column_name,
1,
4
|| 'aud
AFTER INSERT
OR UPDATE
OF '
|| column_name
|| ','
ELSE(CASE
WHEN max_col = column_id THEN ' '
|| column_name
|| '
OR DELETE ON imdb.'
|| table_name
|| '
FOR EACH ROW'
ELSE(CASE
WHEN column_id IS NULL THEN 'CREATE OR REPLACE TRIGGER '
|| SUBSTR
(column_name,
1,
4
|| 'aud
AFTER INSERT
OR UPDATE
OR DELETE ON imdb.'
|| table_name
ELSE ' '
|| column_name
|| ','
END
END
END
END
) text,
table_name1 table_name,
column_id,
1 disp_ord
FROM (SELECT LOWER(REPLACE(column_name,
'O_',
)) column_name, /*changing O to O_*/
LOWER(REPLACE(t.table_name,
'_A_',
)) table_name,
LOWER(t.table_name) table_name1,
c.column_id,
MIN(column_id) OVER(PARTITION BY c.table_name) min_col,
MAX(column_id) OVER(PARTITION BY c.table_name) max_col
FROM all_tab_columns c,
(SELECT object_name table_name
FROM all_objects
WHERE TRUNC(created) = TRUNC(SYSDATE)
AND object_name = 'CHARACTERISTIC_A_T') t
--AND object_name LIKE 'IMDB/_A/_%' ESCAPE '/') t /*commented this line for testing*/
WHERE c.table_name(+) = t.table_name
AND SUBSTR(column_name(+),
1,
2
) = 'O_'))
/*changed the substring condition to match new changes*/
UNION ALL
SELECT (CASE
WHEN min_col = column_id THEN 'DECLARE
BEGIN
IF inserting THEN
pk_imdb_audit.p_ins_characteristic_a_t
(in_'
|| RPAD(column_name,
35,
|| '=> pk_imdb_audit.v_action_inserting,'
ELSE(CASE
WHEN max_col = column_id THEN 'in_'
|| RPAD(column_name,
35,
|| '=> '
|| LOWER(in_col_value)
|| ');'
ELSE ' in_'
|| RPAD(column_name,
35,
|| '=> '
|| LOWER(in_col_value)
|| ','
END
END
) text /*,
table_name,
column_id,
2 disp_ord*/
FROM (SELECT table_name,
column_name,
column_id,
min_col,
max_col,
in_col_value,
trg_header,
'in_'
|| RPAD(column_name,
35,
|| '=> '
|| LOWER(in_col_value)
|| ',' in_col
FROM (SELECT LOWER(c.column_name) column_name,
LOWER(c.table_name) table_name,
c.column_id,
(CASE
WHEN SUBSTR(column_name,
1,
2
) = 'N_' THEN
/*changed the substring condition to match the new change*/
':NEW.'
|| REPLACE
(column_name,
'N_',
'N_'
/*changed the condition to match new requirement*/
WHEN SUBSTR(column_name,
1,
2
) = 'O_' THEN
/*changed the substring condition to match the new change*/
'NULL'
ELSE ':NEW.'
|| REPLACE(column_name,
'_A_',
END
) in_col_value,
LOWER(SUBSTR(column_name,
1,
3
)) trg_header,
MIN(column_id) OVER(PARTITION BY c.table_name) min_col,
MAX(column_id) OVER(PARTITION BY c.table_name) max_col
FROM all_tab_columns c
WHERE c.table_name IN(
SELECT object_name
FROM all_objects
WHERE TRUNC(created) = TRUNC(SYSDATE)
AND object_name = 'CHARACTERISTIC_A_T')
ORDER BY c.table_name,
c.column_id)) -
Urgent Help required in Tunning this query
I have table ACCOUNT SPONSOR HOMESTORE ASH with more than 30 million rows.
My batch daily need to update or insert into this table from a temporary table TEMP_HSTRALCT. The data for temporary table is populated by below query which selects from two tables TRANSACTION POINTS and REDEMPTIONS.However both these tables are partitioned on date time and is run daily and this is running for hours.
Can anyone please help me on tuning this query
INSERT INTO temp_hstralct
(tmp_n_collector_account_num, tmp_v_location_id,
tmp_v_sponsor_id, tmp_v_source_file_name,
tmp_n_psc_insert_ind, tmp_n_psc_update_ind,
tmp_n_transaction_amount, tmp_n_transaction_points,
tmp_n_acc_insert_ind, tmp_n_ash_insert_ind,
tmp_n_col_insert_ind, tmp_n_check_digit,
tmp_n_collector_issue_num, tmp_n_csl_insert_ind,
tmp_v_offer_code, tmp_n_psa_insert_ind)
SELECT DISTINCT trp_n_collector_account_num account_num,
trp_v_location_id location_id,
trp_v_sponsor_id sponsor_id,
trp_c_creation_user batch_id, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0
FROM transaction_points, ACCOUNT, locations_master,homestores
WHERE hsr_v_accrual_allowed = 'Y'
AND trp_n_collector_account_num = ACCOUNT.acc_n_account_num(+)
AND ( ( ( ACCOUNT.acc_v_account_type = 'C'
OR ACCOUNT.acc_v_account_type IS NULL
AND hsr_v_b2c_accounts = 'Y'
OR ( ACCOUNT.acc_v_account_type = 'B'
AND hsr_v_nfb_accounts = 'Y'
OR ( ACCOUNT.acc_v_account_type = 'H'
AND hsr_v_hybrid_accounts = 'Y'
AND trp_d_creation_date_time BETWEEN SYSDATE-3
AND SYSDATE
AND trp_v_sponsor_id = 'JSAINSBURY'
AND trp_v_location_id =
locations_master.lnm_v_location_id
AND locations_master.lnm_v_partner_id = 'JSAINSBURY'
AND ( ( ( (INSTR
(hsr_v_store_status,
locations_master.lnm_c_location_status
) > 0
AND (INSTR
(hsr_v_store_type,
locations_master.lnm_c_location_type
) > 0
AND hsr_v_homestore_assignment = 'ST'
OR ( ( locations_master.lnm_c_homestore_ind =
'Y'
AND (INSTR
(hsr_v_store_status,
locations_master.lnm_c_location_status
) > 0
AND hsr_v_homestore_assignment = 'HS'
UNION ALL
SELECT DISTINCT rdm_n_collector_account_num account_num,
rdm_v_location_id location_id,
rom_v_supplier_id sponsor_id,
rdm_c_creation_user batch_id, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0
FROM redemption_details,
reward_offer_master,
ACCOUNT,
locations_master,
HOMESTORES
WHERE hsr_v_redemption_allowed = 'Y'
AND rdm_n_collector_account_num = ACCOUNT.acc_n_account_num(+)
AND ( ( ( ACCOUNT.acc_v_account_type = 'C'
OR ACCOUNT.acc_v_account_type IS NULL
AND hsr_v_b2c_accounts = 'Y'
OR ( ACCOUNT.acc_v_account_type = 'B'
AND hsr_v_nfb_accounts = 'Y'
OR ( ACCOUNT.acc_v_account_type = 'H'
AND hsr_v_hybrid_accounts = 'Y'
AND rdm_d_creation_date_time BETWEEN SYSDATE-3
AND SYSDATE
AND rom_v_reward_offer_id = rdm_v_reward_id
AND rom_v_supplier_id = 'JSAINSBURY'
AND rdm_v_location_id =
locations_master.lnm_v_location_id
AND locations_master.lnm_v_partner_id ='JSAINSBURY'
AND ( ( ( (INSTR
(hsr_v_store_status,
locations_master.lnm_c_location_status
) > 0
AND (INSTR
(hsr_v_store_type,
locations_master.lnm_c_location_type
) > 0
AND hsr_v_homestore_assignment = 'ST'
OR ( ( locations_master.lnm_c_homestore_ind =
'Y'
AND (INSTR
(hsr_v_store_status,
locations_master.lnm_c_location_status
) > 0
AND hsr_v_homestore_assignment = 'HS'
);I have copied the explain as it is and can you please try pasting in the text pad.Can you let me know whether parallel hint on this will speed up the select queries.
Plan
INSERT STATEMENT CHOOSECost: 410,815 Bytes: 2,798,394 Cardinality: 15,395
32 UNION-ALL
15 SORT UNIQUE Cost: 177,626 Bytes: 2,105,592 Cardinality: 11,896
14 FILTER
13 HASH JOIN Cost: 177,312 Bytes: 2,105,592 Cardinality: 11,896
2 TABLE ACCESS BY INDEX ROWID LMHOLTP.LOCATIONS_MASTER Cost: 37 Bytes: 23,184 Cardinality: 966
1 INDEX RANGE SCAN NON-UNIQUE LMHOLTP.IX_LOCATIONS_MASTER_3 Cost: 3 Cardinality: 1
12 FILTER
11 HASH JOIN OUTER
8 MERGE JOIN CARTESIAN Cost: 155,948 Bytes: 702,656,660 Cardinality: 4,845,908
3 TABLE ACCESS FULL LMHOLTP.HOMESTORES Cost: 2 Bytes: 104 Cardinality: 1
7 BUFFER SORT Cost: 155,946 Bytes: 198,682,228 Cardinality: 4,845,908
6 PARTITION RANGE ITERATOR Partition #: 12
5 TABLE ACCESS BY LOCAL INDEX ROWID LMHOLTP.TRANSACTION_POINTS Cost: 155,946 Bytes: 198,682,228 Cardinality: 4,845,908 Partition #: 12
4 INDEX RANGE SCAN NON-UNIQUE LMHOLTP.IX_TRANSACTION_POINTS_1 Cost: 24,880 Cardinality: 6,978,108 Partition #: 12
10 PARTITION RANGE ALL Partition #: 15 Partitions accessed #1 - #5
9 TABLE ACCESS FULL LMHOLTP.ACCOUNT Cost: 6,928 Bytes: 68,495,680 Cardinality: 8,561,960 Partition #: 15 Partitions accessed #1 - #5
31 SORT UNIQUE Cost: 233,189 Bytes: 692,802 Cardinality: 3,499
30 FILTER
29 FILTER
28 NESTED LOOPS OUTER
24 HASH JOIN Cost: 226,088 Bytes: 664,810 Cardinality: 3,499
16 TABLE ACCESS FULL LMHOLTP.REWARD_OFFER_MASTER Cost: 8 Bytes: 2,280 Cardinality: 114
23 HASH JOIN Cost: 226,079 Bytes: 8,327,280 Cardinality: 48,984
20 TABLE ACCESS BY INDEX ROWID LMHOLTP.LOCATIONS_MASTER Cost: 37 Bytes: 432 Cardinality: 18
19 NESTED LOOPS Cost: 39 Bytes: 2,304 Cardinality: 18
17 TABLE ACCESS FULL LMHOLTP.HOMESTORES Cost: 2 Bytes: 104 Cardinality: 1
18 INDEX RANGE SCAN NON-UNIQUE LMHOLTP.IX_LOCATIONS_MASTER_3 Cost: 3 Cardinality: 966
22 PARTITION RANGE ITERATOR Partition #: 28
21 TABLE ACCESS FULL LMHOLTP.REDEMPTION_DETAILS Cost: 226,019 Bytes: 261,636,270 Cardinality: 6,229,435 Partition #: 28
27 PARTITION RANGE ITERATOR Partition #: 30
26 TABLE ACCESS BY LOCAL INDEX ROWID LMHOLTP.ACCOUNT Cost: 2 Bytes: 8 Cardinality: 1 Partition #: 30
25 INDEX UNIQUE SCAN UNIQUE LMHOLTP.CO_PK_ACCOUNT Cost: 1 Cardinality: 1 Partition #: 30 -
PROCEDURE procJob IS
CURSOR c1(staff_in NUMBER) IS
SELECT staffid
FROM jobHist
WHERE staffid = staff_in
FOR UPDATE OF todate;
c1_rec jobHist.staffid%TYPE;
n number;
i number;
BEGIN
OPEN c1(:STAFF.STAFFID);
loop
fetch c1 into c1_rec;
exit when c1%notfound;
end loop;
n := c1%rowcount;
CLOSE c1;
i := 0;
OPEN c1(:STAFF.STAFFID);
WHILE i <= n LOOP
i := i + 1;
FETCH c1 INTO c1_rec;
EXIT WHEN c1%NOTFOUND;
IF i = n THEN
UPDATE jobHist SET todate = to_date(SYSDATE,'DD- MM-YYYY') WHERE CURRENT OF c1;
END IF;
END LOOP;
CLOSE c1;
END;
The above code is ran from a button press and is intended to get the last record in the cursor and update the corresponding record in the jobHist table.
I think this is too complex for what I want done. Is there any way of counting the amount of records in a form data block and then going to the last one and updating it???????
thanksMichael,
I am not sure I understood your problem.
what do you mean with last record?.
last entered in the table according to the date?.
1.suggestion: you can change the order of the block data, order by date descending or ascending...then you 'll get the required record for update at the first position. then you dont need to loop until last record.
2. suggestion: you can loop trough all records in a block
and You test the system varibale ":system.last_record"
if true or not...if true update the record.
Use the built-in routines: first_record; down
Hope this hepls,
CB -
How to tune this smiple SQL (takes long time to come up with results)
the following SQL is very slow as it takes one day to complete...
select A.* from (SELECT a.n_agent_no, a.v_agent_code, a.n_channel_no, v_iden_no, a.n_cust_ref_no, a.v_agent_type, a.v_company_code,
a.v_company_branch, a.v_it_no, bfn_get_agent_name(a.n_agent_no) agentname,
PKG_AGE__TAX.GET_TAX_AMT(:P_FROM_DATE,:P_TO_DATE,:P_LOB_CODE,A.N_AGENT_NO) comm,
c.v_ird_region
FROM agent_master a, agent_lob b, agency_region c
WHERE a.n_agent_no = b.n_agent_no
AND a.v_agency_region = c.v_agency_region
--AND :p_lob_code = DECODE(:p_lob_code,'ALL', 'ALL',b.v_line_of_business)
--AND :p_channel_no = DECODE(:p_channel_no,1000, 1000,a.n_channel_no)
--AND :p_agency_group = DECODE(:p_agency_group,'ALL', 'ALL',c.v_ird_region)
group by a.n_agent_no, a.v_agent_code, a.n_channel_no, v_iden_no, a.n_cust_ref_no, a.v_agent_type, a.v_company_code, a.v_company_branch, a.v_it_no, bfn_get_agent_name(a.n_agent_no) ,
BPG_AGENCY_GEN_ACL_TAX.BFN_GET_TAX_AMOUNT(:P_FROM_DATE,:P_TO_DATE,:P_LOB_CODE,A.N_AGENT_NO),
c.v_ird_region
ORDER BY c.v_ird_region, a.v_agent_code DESC)
A
WHERE (COMM < :P_VAL_IND OR COMM >=:P_VAL_IND1);
. .it should return all the agents with commission based on the date parameter... data is less then 50 K inside all
the tables...
the version is Oracle9i Enterprise Edition Release 9.2.0.5.0
SQL> explain plan for
2 select A.* from (SELECT a.n_agent_no, a.v_agent_code, a.n_channel_no, v_iden_no, a.n_cust_ref_
no, a.v_agent_type, a.v_company_code,
3 a.v_company_branch, a.v_it_no, bfn_get_agent_name(a.n_agent_no) agentname,
4 BPG_AGENCY_GEN_ACL_TAX.BFN_GET_TAX_AMOUNT(:P_FROM_DATE,:P_TO_DATE,:P_LOB_CODE,A.N_AGENT_NO) com
m,
5 c.v_ird_region
6 FROM ammm_agent_master a, ammt_agent_lob b, gnlu_agency_region c
7 WHERE a.n_agent_no = b.n_agent_no
8 AND a.v_agency_region = c.v_agency_region
9 --AND :p_lob_code = DECODE(:p_lob_code,'ALL', 'ALL',b.v_line_of_business)
10 --AND :p_channel_no = DECODE(:p_channel_no,1000, 1000,a.n_channel_no)
11 --AND :p_agency_group = DECODE(:p_agency_group,'ALL', 'ALL',c.v_ird_region)
12 group by a.n_agent_no, a.v_agent_code, a.n_channel_no, v_iden_no, a.n_cust_ref_no, a.v_agent_ty
pe, a.v_company_code, a.v_company_branch, a.v_it_no, bfn_get_agent_name(a.n_agent_no) ,
13 BPG_AGENCY_GEN_ACL_TAX.BFN_GET_TAX_AMOUNT(:P_FROM_DATE,:P_TO_DATE,:P_LOB_CODE,A.N_AGENT_NO),
14 c.v_ird_region
15 ORDER BY c.v_ird_region, a.v_agent_code DESC)
16 A
17 WHERE (COMM < :P_VAL_IND OR COMM >=:P_VAL_IND1);
Explained.
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)|
| 0 | SELECT STATEMENT | | 13315 | 27M| | 859 (63)|
| 1 | VIEW | | 13315 | 27M| | |
| 2 | SORT GROUP BY | | 13315 | 936K| 2104K| 859 (63)|
| 3 | HASH JOIN | | 13315 | 936K| | 641 (81)|
| 4 | MERGE JOIN | | 3118 | 204K| | 512 (86)|
| 5 | TABLE ACCESS BY INDEX ROWID| AGENCY_REGION | 8 | 152 | | 3 (34)|
| 6 | INDEX FULL SCAN | SYS_C004994 | 8 | | | 2 (50)|
| 7 | SORT JOIN | | 3142 | 147K| | 510 (86)|
| 8 | TABLE ACCESS FULL | AGENT_MASTER | 3142 | 147K| | 506 (86)|
| 9 | TABLE ACCESS FULL | AGENT_LOB | 127K| 623K| | 102 (50)|
Note: PLAN_TABLE' is old version
17 rows selected.
..This is the only information i can get as i cannot access over database server (user security limitation)...
Thank YouTry to remove this:
ORDER BY c.v_ird_region, a.v_agent_code DESCOr move it to the end of entire query.
Edited by: Random on Jun 19, 2009 1:01 PM -
Can any one help me to tune this query
This is the query.
~~~~~~~~~~
SELECT
S_CONTACT.ROW_ID,
S_CONTACT.MODIFICATION_NUM,
S_CONTACT.LAST_UPD
FROM
S_CONTACT,
S_CONTACT_FNX,
S_ETL_I_IMG_118 IMG
WHERE
IMG.ROW_ID = S_CONTACT_FNX.ROW_ID
AND
S_CONTACT_FNX.PAR_ROW_ID = S_CONTACT.ROW_ID
AND NOT EXISTS
( SELECT 'X'
FROM
S_ETL_I_IMG_12 IMG1
WHERE
IMG1.ROW_ID = S_CONTACT.ROW_ID
UNION ALL
SELECT
S_CONTACT.ROW_ID,
S_CONTACT.MODIFICATION_NUM,
S_CONTACT.LAST_UPD
FROM
S_CONTACT,
S_ETL_I_IMG_109 IMG
WHERE
IMG.ROW_ID = S_CONTACT.PR_SPECIALTY_ID
AND NOT EXISTS
( SELECT 'X'
FROM
S_ETL_I_IMG_12 IMG1
WHERE
IMG1.ROW_ID = S_CONTACT.ROW_ID
UNION ALL
SELECT
S_CONTACT.ROW_ID,
S_CONTACT.MODIFICATION_NUM,
S_CONTACT.LAST_UPD
FROM
S_CONTACT,
S_ETL_I_IMG_113 IMG
WHERE
IMG.ROW_ID = S_CONTACT.MED_SPEC_ID
AND NOT EXISTS
( SELECT 'X'
FROM
S_ETL_I_IMG_12 IMG1
WHERE
IMG1.ROW_ID = S_CONTACT.ROW_ID
UNION ALL
SELECT
S_CONTACT.ROW_ID,
S_CONTACT.MODIFICATION_NUM,
S_CONTACT.LAST_UPD
FROM
S_CONTACT,
S_ETL_I_IMG_125 IMG
WHERE
IMG.ROW_ID = S_CONTACT.REGION_ID
AND NOT EXISTS
( SELECT 'X'
FROM
S_ETL_I_IMG_12 IMG1
WHERE
IMG1.ROW_ID = S_CONTACT.ROW_ID
Below is the explain plan
~~~~~~~~~~~~~~~~~~~~~
PLAN_TABLE_OUTPUT
Plan hash value: 363891185
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 4 | 334 | | 214K(100)| 00:42:50 |
| 1 | UNION-ALL | | | | | | |
|* 2 | HASH JOIN ANTI | | 1 | 64 | | 122 (1)| 00:00:02 |
| 3 | NESTED LOOPS | | 3518 | 178K| | 119 (0)| 00:00:02 |
| 4 | NESTED LOOPS | | 3518 | 98504 | | 13 (0)| 00:00:01 |
| 5 | INDEX FULL SCAN | S_ETL_I_IMG_118_M2 | 3518 | 35180 | | 1 (0)| 00:00:01 |
PLAN_TABLE_OUTPUT
| 6 | TABLE ACCESS BY INDEX ROWID| S_CONTACT_FNX | 1 | 18 | | 1 (0)| 00:00:01 |
|* 7 | INDEX UNIQUE SCAN | S_CONTACT_FNX_P1 | 1 | | | 1 (0)| 00:00:01 |
| 8 | TABLE ACCESS BY INDEX ROWID | S_CONTACT | 1 | 24 | | 1 (0)| 00:00:01 |
|* 9 | INDEX UNIQUE SCAN | S_CONTACT_P1 | 1 | | | 1 (0)| 00:00:01 |
| 10 | INDEX FULL SCAN | S_ETL_I_IMG_12_M2 | 94772 | 1110K| | 2 (0)| 00:00:01 |
| 11 | NESTED LOOPS | | 1 | 70 | | 214K (1)| 00:42:49 |
| 12 | MERGE JOIN ANTI | | 1 | 38 | | 214K (1)| 00:42:49 |
|* 13 | TABLE ACCESS BY INDEX ROWID | S_CONTACT | 72253 | 1834K| | 213K (1)| 00:42:43 |
| 14 | INDEX FULL SCAN | S_CONTACT_P1 | 57M| | | 2904 (1)| 00:00:35 |
|* 15 | SORT UNIQUE | | 94772 | 1110K| 3736K| 441 (2)| 00:00:06 |
| 16 | INDEX FULL SCAN | S_ETL_I_IMG_12_M2 | 94772 | 1110K| | 2 (0)| 00:00:01 |
PLAN_TABLE_OUTPUT
|* 17 | INDEX RANGE SCAN | S_ETL_I_IMG_109_M2 | 1 | 32 | | 1 (0)| 00:00:01 |
| 18 | NESTED LOOPS | | 1 | 100 | | 3 (0)| 00:00:01 |
| 19 | NESTED LOOPS ANTI | | 1 | 68 | | 2 (0)| 00:00:01 |
| 20 | TABLE ACCESS BY INDEX ROWID | S_CONTACT | 1 | 56 | | 1 (0)| 00:00:01 |
|* 21 | INDEX FULL SCAN | S_CONTACT_F58 | 1 | | | 1 (0)| 00:00:01 |
|* 22 | INDEX RANGE SCAN | S_ETL_I_IMG_12_M2 | 94772 | 1110K| | 1 (0)| 00:00:01 |
|* 23 | INDEX RANGE SCAN | S_ETL_I_IMG_113_M2 | 1 | 32 | | 1 (0)| 00:00:01 |
| 24 | NESTED LOOPS ANTI | | 1 | 100 | | 3 (0)| 00:00:01 |
| 25 | NESTED LOOPS | | 1 | 88 | | 2 (0)| 00:00:01 |
| 26 | TABLE ACCESS BY INDEX ROWID | S_CONTACT | 1 | 56 | | 1 (0)| 00:00:01 |
|* 27 | INDEX FULL SCAN | S_CONTACT_F62 | 1 | | | 1 (0)| 00:00:01 |
PLAN_TABLE_OUTPUT
|* 28 | INDEX RANGE SCAN | S_ETL_I_IMG_125_M2 | 1 | 32 | | 1 (0)| 00:00:01 |
|* 29 | INDEX RANGE SCAN | S_ETL_I_IMG_12_M2 | 94772 | 1110K| | 1 (0)| 00:00:01 |
Predicate Information (identified by operation id):
2 - access("IMG1"."ROW_ID"="S_CONTACT"."ROW_ID")
7 - access("IMG"."ROW_ID"="S_CONTACT_FNX"."ROW_ID")
9 - access("S_CONTACT_FNX"."PAR_ROW_ID"="S_CONTACT"."ROW_ID")
13 - filter("S_CONTACT"."PR_SPECIALTY_ID" IS NOT NULL)
PLAN_TABLE_OUTPUT
15 - access("IMG1"."ROW_ID"="S_CONTACT"."ROW_ID")
filter("IMG1"."ROW_ID"="S_CONTACT"."ROW_ID")
17 - access("IMG"."ROW_ID"="S_CONTACT"."PR_SPECIALTY_ID")
21 - filter("S_CONTACT"."MED_SPEC_ID" IS NOT NULL)
22 - access("IMG1"."ROW_ID"="S_CONTACT"."ROW_ID")
23 - access("IMG"."ROW_ID"="S_CONTACT"."MED_SPEC_ID")
27 - filter("S_CONTACT"."REGION_ID" IS NOT NULL)
28 - access("IMG"."ROW_ID"="S_CONTACT"."REGION_ID")
29 - access("IMG1"."ROW_ID"="S_CONTACT"."ROW_ID")PLAN_TABLE_OUTPUT
Plan hash value: 363891185
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 4 | 334 | | 214K(100)| 00:42:50 |
| 1 | UNION-ALL | | | | | | |
|* 2 | HASH JOIN ANTI | | 1 | 64 | | 122 (1)| 00:00:02 |
| 3 | NESTED LOOPS | | 3518 | 178K| | 119 (0)| 00:00:02 |
| 4 | NESTED LOOPS | | 3518 | 98504 | | 13 (0)| 00:00:01 |
| 5 | INDEX FULL SCAN | S_ETL_I_IMG_118_M2 | 3518 | 35180 | | 1 (0)| 00:00:01 |
PLAN_TABLE_OUTPUT
| 6 | TABLE ACCESS BY INDEX ROWID| S_CONTACT_FNX | 1 | 18 | | 1 (0)| 00:00:01 |
|* 7 | INDEX UNIQUE SCAN | S_CONTACT_FNX_P1 | 1 | | | 1 (0)| 00:00:01 |
| 8 | TABLE ACCESS BY INDEX ROWID | S_CONTACT | 1 | 24 | | 1 (0)| 00:00:01 |
|* 9 | INDEX UNIQUE SCAN | S_CONTACT_P1 | 1 | | | 1 (0)| 00:00:01 |
| 10 | INDEX FULL SCAN | S_ETL_I_IMG_12_M2 | 94772 | 1110K| | 2 (0)| 00:00:01 |
| 11 | NESTED LOOPS | | 1 | 70 | | 214K (1)| 00:42:49 |
| 12 | MERGE JOIN ANTI | | 1 | 38 | | 214K (1)| 00:42:49 |
|* 13 | TABLE ACCESS BY INDEX ROWID | S_CONTACT | 72253 | 1834K| | 213K (1)| 00:42:43 |
| 14 | INDEX FULL SCAN | S_CONTACT_P1 | 57M| | | 2904 (1)| 00:00:35 |
|* 15 | SORT UNIQUE | | 94772 | 1110K| 3736K| 441 (2)| 00:00:06 |
| 16 | INDEX FULL SCAN | S_ETL_I_IMG_12_M2 | 94772 | 1110K| | 2 (0)| 00:00:01 |
PLAN_TABLE_OUTPUT
|* 17 | INDEX RANGE SCAN | S_ETL_I_IMG_109_M2 | 1 | 32 | | 1 (0)| 00:00:01 |
| 18 | NESTED LOOPS | | 1 | 100 | | 3 (0)| 00:00:01 |
| 19 | NESTED LOOPS ANTI | | 1 | 68 | | 2 (0)| 00:00:01 |
| 20 | TABLE ACCESS BY INDEX ROWID | S_CONTACT | 1 | 56 | | 1 (0)| 00:00:01 |
|* 21 | INDEX FULL SCAN | S_CONTACT_F58 | 1 | | | 1 (0)| 00:00:01 |
|* 22 | INDEX RANGE SCAN | S_ETL_I_IMG_12_M2 | 94772 | 1110K| | 1 (0)| 00:00:01 |
|* 23 | INDEX RANGE SCAN | S_ETL_I_IMG_113_M2 | 1 | 32 | | 1 (0)| 00:00:01 |
| 24 | NESTED LOOPS ANTI | | 1 | 100 | | 3 (0)| 00:00:01 |
| 25 | NESTED LOOPS | | 1 | 88 | | 2 (0)| 00:00:01 |
| 26 | TABLE ACCESS BY INDEX ROWID | S_CONTACT | 1 | 56 | | 1 (0)| 00:00:01 |
|* 27 | INDEX FULL SCAN | S_CONTACT_F62 | 1 | | | 1 (0)| 00:00:01 |
PLAN_TABLE_OUTPUT
|* 28 | INDEX RANGE SCAN | S_ETL_I_IMG_125_M2 | 1 | 32 | | 1 (0)| 00:00:01 |
|* 29 | INDEX RANGE SCAN | S_ETL_I_IMG_12_M2 | 94772 | 1110K| | 1 (0)| 00:00:01 |
Predicate Information (identified by operation id):
2 - access("IMG1"."ROW_ID"="S_CONTACT"."ROW_ID")
7 - access("IMG"."ROW_ID"="S_CONTACT_FNX"."ROW_ID")
9 - access("S_CONTACT_FNX"."PAR_ROW_ID"="S_CONTACT"."ROW_ID")
13 - filter("S_CONTACT"."PR_SPECIALTY_ID" IS NOT NULL)
PLAN_TABLE_OUTPUT
15 - access("IMG1"."ROW_ID"="S_CONTACT"."ROW_ID")
filter("IMG1"."ROW_ID"="S_CONTACT"."ROW_ID")
17 - access("IMG"."ROW_ID"="S_CONTACT"."PR_SPECIALTY_ID")
21 - filter("S_CONTACT"."MED_SPEC_ID" IS NOT NULL)
22 - access("IMG1"."ROW_ID"="S_CONTACT"."ROW_ID")
23 - access("IMG"."ROW_ID"="S_CONTACT"."MED_SPEC_ID")
27 - filter("S_CONTACT"."REGION_ID" IS NOT NULL)
28 - access("IMG"."ROW_ID"="S_CONTACT"."REGION_ID")
29 - access("IMG1"."ROW_ID"="S_CONTACT"."ROW_ID") -
How to tune this SQL (takes long time to come up with results)
Dear all,
I have sum SQL which takes long time ... can any one help me to tune this.... thank You
SELECT SUM (n_amount)
FROM (SELECT DECODE (v_payment_type,
'D', n_amount,
'C', -n_amount
) n_amount, v_vou_no
FROM vouch_det a, temp_global_temp b
WHERE a.v_vou_no = TO_CHAR (b.n_column2)
AND b.n_column1 = :b5
AND b.v_column1 IN (:b4, :b3)
AND v_desc IN (SELECT v_trans_source_code
FROM benefit_trans_source
WHERE v_income_tax_app = :b6)
AND v_lob_code = DECODE (:b1, :b2, v_lob_code, :b1)
UNION ALL
SELECT DECODE (v_payment_type,
'D', n_amount,
'C', -n_amount
* -1 AS n_amount,
v_vou_no
FROM vouch_details a, temp_global_temp b
WHERE a.v_vou_no = TO_CHAR (b.n_column2)
AND b.n_column1 = :b5
AND b.v_column1 IN (:b12, :b11, :b10, :b9, :b8, :b7)
AND v_desc IN (SELECT v_trans_source_code
FROM benefit_trans_source
WHERE income_tax_app = :b6)
AND v_lob_code = DECODE (:b1, :b2, v_lob_code, :b1));
Thank You.....Thanks a lot,
i did change the SQL it works fine but slows down my main query.... actually my main query is calling a function which does the sum......
here is the query.....?
select A.* from (SELECT a.n_agent_no, a.v_agent_code, a.n_channel_no, v_iden_no, a.n_cust_ref_no, a.v_agent_type, a.v_company_code,
a.v_company_branch, a.v_it_no, bfn_get_agent_name(a.n_agent_no) agentname,
PKG_AGE__TAX.GET_TAX_AMT(:P_FROM_DATE,:P_TO_DATE,:P_LOB_CODE,A.N_AGENT_NO) comm,
c.v_ird_region
FROM agent_master a, agent_lob b, agency_region c
WHERE a.n_agent_no = b.n_agent_no
AND a.v_agency_region = c.v_agency_region
AND :p_lob_code = DECODE(:p_lob_code,'ALL', 'ALL',b.v_line_of_business)
AND :p_channel_no = DECODE(:p_channel_no,1000, 1000,a.n_channel_no)
AND :p_agency_group = DECODE(:p_agency_group,'ALL', 'ALL',c.v_ird_region)
group by a.n_agent_no, a.v_agent_code, a.n_channel_no, v_iden_no, a.n_cust_ref_no, a.v_agent_type, a.v_company_code, a.v_company_branch, a.v_it_no, bfn_get_agent_name(a.n_agent_no) ,
BPG_AGENCY_GEN_ACL_TAX.BFN_GET_TAX_AMOUNT(:P_FROM_DATE,:P_TO_DATE,:P_LOB_CODE,A.N_AGENT_NO),
c.v_ird_region
ORDER BY c.v_ird_region, a.v_agent_code DESC)
A
WHERE (COMM < :P_VAL_IND OR COMM >=:P_VAL_IND1);
Any idea to make this faster....
Thank You... -
Help needed to tune the Query:Statistics added
Can someone DBA please help me to tune this query:
SELECT DISTINCT K.ATTRIBUTE_VALUE AGENCY_ID,B.PROFILE_NM ,NVL(G.OFFICE_DESC,'--') OFFICE_DESC,f.OFFICE_ID,B.PROFILE_ID,'%' ROLE,'%' LAYOUT,
CASE
WHEN 'flagB' = '%' THEN
NVL(J.ISS_GRP_DESC,'BILLING')
WHEN 'flagO' = '%' THEN
NVL(J.ISS_GRP_DESC,'ORDERING')
WHEN 'flag' = '%' THEN
NVL(J.ISS_GRP_DESC,'BILLING/ORDERING')
ELSE
NVL(J.ISS_GRP_DESC,' ')
END ISS_GRP_DESC,
DECODE(NVL(H.USERID,' ') ,' ','--','<a sbcuid_in=' || H.USERID || ' target=NEW >'||H.FIRSTNAME || ' ' || H.LASTNAME || '( ' || H.USERID || ' )</a>' ) USER_NAME
FROM
PROFILE_PORTAL B ,
TBL_BDA_AGENCY_RESP_REP C ,
TBL_BDA_AGENCY_OFFICE F,
TBL_BDA_OFFICE G,
USERS_PORTAL H,
TBL_BDA_USR_ISS_GRP I ,
TBL_BDA_ISS_GROUP J,
ATTRIBUTE_VALUES_PORTAL K,
PROFILE_TYPE_PORTAL L
WHERE
B.PROFILE_ID = F.AGENCY_ID (+)
AND B.PROFILE_ID = C.AGENCY_ID (+)
AND G.OFFICE_ID (+)= F.OFFICE_ID
AND H.USERID (+)= C.RESP_USR_ID
AND C.ISS_GRP_ID = I.ISS_GRP_ID (+)
AND I.ISS_GRP_ID = J.ISS_GRP_ID(+)
AND 'PROFILE.'||B.PROFILE_ID = K.ENTITY_ID(+)
AND K.ATTRIBUTE_VALUE IS NOT NULL
AND L.PROFILE_TYPE_ID = B.PROFILE_TYPE_ID
AND L.APPLICATION_CD='BDA'
AND NOT EXISTS (SELECT agency_id
FROM TBL_BDA_AGENCY_RESP_REP t
WHERE t.ISS_GRP_ID IN ('%')
AND t.AGENCY_ID = C.AGENCY_ID)
AND K.ATTRIBUTE_VALUE LIKE '%'
AND UPPER(B.PROFILE_NM) LIKE UPPER('%')
AND (to_char(NVL(B.PROFILE_ID,0)) LIKE '%' OR NVL(B.PROFILE_ID,0) IN ('a'))
AND NVL(G.OFFICE_ID,0) IN ('%')
AND (to_char(NVL(C.RESP_USR_ID,'0')) LIKE '%' OR NVL(C.RESP_USR_ID,'0') IN ('k'))
ORDER BY PROFILE_NM
The number of rows in these tables are as follows:
PROFILE_PORTAL -- 2392
TBL_BDA_AGENCY_RESP_REP 3508
TBL_BDA_AGENCY_OFFICE 2151
TBL_BDA_OFFICE 3
USERS_PORTAL 270500
TBL_BDA_USR_ISS_GRP 234
TBL_BDA_ISS_GROUP 2
ATTRIBUTE_VALUES_PORTAL 2790
PROFILE_TYPE_PORTAL 3
The Explain pal nhas given this o/p to me:
SQL> select * from table(dbms_xplan.display) dual;
PLAN_TABLE_OUTPUT
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost |
| 0 | SELECT STATEMENT | | 807 | 102K| | 2533 |
| 1 | SORT UNIQUE | | 807 | 102K| 232K| 82 |
|* 2 | FILTER | | | | | |
|* 3 | HASH JOIN OUTER | | 807 | 102K| | 52 |
|* 4 | HASH JOIN OUTER | | 807 | 95226 | | 40 |
|* 5 | TABLE ACCESS BY INDEX ROWID | ATTRIBUTE_VALUES | 1 | 23 | | 2 |
| 6 | NESTED LOOPS | | 7 | 805 | | 37 |
| 7 | NESTED LOOPS OUTER | | 6 | 552 | | 25 |
|* 8 | FILTER | | | | | |
| 9 | NESTED LOOPS OUTER | | | | | |
|* 10 | FILTER | | | | | |
| 11 | NESTED LOOPS OUTER | | | | | |
| 12 | NESTED LOOPS OUTER | | 3 | 141 | | 10 |
|* 13 | HASH JOIN | | 3 | 120 | | 7 |
|* 14 | TABLE ACCESS FULL | PROFILE | 6 | 198 | | 4 |
|* 15 | TABLE ACCESS FULL | PROFILE_TYPE | 1 | 7 | | 2 |
|* 16 | INDEX RANGE SCAN | SYS_C0019777 | 1 | 7 | | 1 |
| 17 | TABLE ACCESS BY INDEX ROWID| TBL_BDA_OFFICE | 1 | 10 | | 1 |
|* 18 | INDEX UNIQUE SCAN | SYS_C0019800 | 1 | | | |
| 19 | TABLE ACCESS BY INDEX ROWID | TBL_BDA_AGENCY_RESP_REP | 2 | 26 | | 2 |
|* 20 | INDEX RANGE SCAN | IDX_AGECYRESP_AGNCYID | 2 | | | 1 |
| 21 | TABLE ACCESS BY INDEX ROWID | USER_ | 1 | 22 | | 1 |
|* 22 | INDEX UNIQUE SCAN | USER_PK | 1 | | | |
|* 23 | INDEX RANGE SCAN | IDX_ATTVAL_ENTATTID | 1 | | | 1 |
| 24 | TABLE ACCESS FULL | TBL_BDA_USR_ISS_GRP | 234 | 702 | | 2 |
| 25 | TABLE ACCESS FULL | TBL_BDA_ISS_GROUP | 2 | 24 | | 2 |
|* 26 | TABLE ACCESS BY INDEX ROWID | TBL_BDA_AGENCY_RESP_REP | 1 | 7 | | 3 |
|* 27 | INDEX RANGE SCAN | IDX_AGECYRESP_AGNCYID | 2 | | | 1 |
Predicate Information (identified by operation id):
2 - filter( NOT EXISTS (SELECT /*+ */ 0 FROM "TBL_BDA_AGENCY_RESP_REP" "T" WHERE "T"."AGENCY_ID"=:B1
AND "T"."ISS_GRP_ID"=TO_NUMBER('%')))
3 - access("I"."ISS_GRP_ID"="J"."ISS_GRP_ID"(+))
4 - access("SYS_ALIAS_1"."ISS_GRP_ID"="I"."ISS_GRP_ID"(+))
5 - filter("K"."ATTRIBUTE_VALUE" IS NOT NULL AND "K"."ATTRIBUTE_VALUE" LIKE '%')
8 - filter(NVL("SYS_ALIAS_1"."RESP_USR_ID",'0') LIKE '%' OR NVL("SYS_ALIAS_1"."RESP_USR_ID",'0')='k')
10 - filter(NVL("G"."OFFICE_ID",0)=TO_NUMBER('%'))
13 - access("L"."PROFILE_TYPE_ID"="B"."PROFILE_TYPE_ID")
14 - filter(UPPER("B"."PROFILE_NM") LIKE '%' AND (TO_CHAR(NVL("B"."PROFILE_ID",0)) LIKE '%' OR
NVL("B"."PROFILE_ID",0)=TO_NUMBER('a')))
15 - filter("L"."APPLICATION_CD"='BDA')
16 - access("B"."PROFILE_ID"="F"."AGENCY_ID"(+))
18 - access("G"."OFFICE_ID"(+)="F"."OFFICE_ID")
20 - access("B"."PROFILE_ID"="SYS_ALIAS_1"."AGENCY_ID"(+))
22 - access("H"."USERID"(+)="SYS_ALIAS_1"."RESP_USR_ID")
23 - access("K"."ENTITY_ID"='PROFILE.'||TO_CHAR("B"."PROFILE_ID"))
26 - filter("T"."ISS_GRP_ID"=TO_NUMBER('%'))
27 - access("T"."AGENCY_ID"=:B1)
Note: cpu costing is off
57 rows selected.
Elapsed: 00:00:01.08
Please help me.
Aashish S.Hello Eric,
Here is the code:
SELECT DISTINCT
K.ATTRIBUTE_VALUE AGENCY_ID,
B.PROFILE_NM ,
NVL(G.OFFICE_DESC,'--') OFFICE_DESC,
f.OFFICE_ID,
B.PROFILE_ID,
'%' ROLE,
'%' LAYOUT,
case
WHEN 'flagB' = '%' THEN
NVL(J.ISS_GRP_DESC,'BILLING')
WHEN 'flagO' = '%' THEN
NVL(J.ISS_GRP_DESC,'ORDERING')
WHEN 'flag' = '%' THEN
NVL(J.ISS_GRP_DESC,'BILLING/ORDERING')
else
NVL(J.ISS_GRP_DESC,' ')
END ISS_GRP_DESC,
DECODE(NVL(H.USERID,' ') ,' ','--','<a sbcuid_in=' || H.USERID || ' target=NEW >'||H.FIRSTNAME || ' ' || H.LASTNAME ||
'( ' || H.USERID || ' )</a>' ) USER_NAME
from
PROFILE_PORTAL B ,
TBL_BDA_AGENCY_RESP_REP C ,
TBL_BDA_AGENCY_OFFICE F,
TBL_BDA_OFFICE G,
USERS_PORTAL H,
TBL_BDA_USR_ISS_GRP I ,
TBL_BDA_ISS_GROUP J,
ATTRIBUTE_VALUES_PORTAL K,
PROFILE_TYPE_PORTAL L
WHERE
B.PROFILE_ID = F.AGENCY_ID (+)
AND B.PROFILE_ID = C.AGENCY_ID (+)
AND G.OFFICE_ID (+)= F.OFFICE_ID
AND H.USERID (+)= C.RESP_USR_ID
AND C.ISS_GRP_ID = I.ISS_GRP_ID (+)
AND I.ISS_GRP_ID = J.ISS_GRP_ID(+)
AND 'PROFILE.'||B.PROFILE_ID = K.ENTITY_ID(+)
AND K.ATTRIBUTE_VALUE IS NOT NULL
AND L.PROFILE_TYPE_ID = B.PROFILE_TYPE_ID
AND L.APPLICATION_CD='BDA'
AND NOT EXISTS
(SELECT agency_id
FROM TBL_BDA_AGENCY_RESP_REP t
WHERE t.ISS_GRP_ID IN (1)
AND t.AGENCY_ID = C.AGENCY_ID)
AND K.ATTRIBUTE_VALUE LIKE '%'
AND UPPER(B.PROFILE_NM) LIKE UPPER('%')
AND (to_char(NVL(B.PROFILE_ID,0))
LIKE '%'
OR NVL(B.PROFILE_ID,0) IN (1))
AND NVL(G.OFFICE_ID,0) IN (1)
AND (to_char(NVL(C.RESP_USR_ID,'0'))
LIKE '%'
OR NVL(C.RESP_USR_ID,'0') IN ('%'))
ORDER BY PROFILE_NM
This is the Query and the query takes some mins. to run in prod environment.
From the Query plan ,I am not able to get any idea for optimization.
Now,Can you tell me which steps I need to follow to run it faster and which all modifications should be made?
Thanks.
Aashish S. -
Please tune this query.
Hi Experts,
My below query is taking long time.
[code]SELECT FAX_LIST.*
FROM (SELECT /*+ use_nl(fax, src) */
ROW_NUMBER () OVER (ORDER BY fax.ID ASC NULLS FIRST) RN,
fax.ACCOUNT_TYPE,
fax.BU_FILE_LOCATION,
fax.COUNT_PAGES_RECEIVED,
NVL (fax.CUSTOMER_NAME, fax.SENDER_NAME) AS CUSTOMER_NAME,
fax.FAX_SOURCE,
fax.CUSTOMER_NUMBER,
fax.CUSTOMER_OMEGA_NUMBER,
fax.GENIFAX_RECIPIENT_ID,
fax.ID AS FAX_ID,
fax.DATE_RECEIVED AS FAX_RECEIVED,
fax.IS_LOCKED,
fax.LOCKED_BY,
fax.ORIGINATOR_CSI,
fax.MARGIN,
fax.PAYMENT_TYPE,
fax.PRIORITY_CODE,
fax.PRIORITY_VALUE,
FROM_TZ (fax.DATE_RECEIVED, 'UTC')
AT TIME ZONE fax.LOCAL_TZ_NAME
AS DATE_RECEIVED,
fax.SALES_PERSON,
fax.SENDER_EMAIL,
fax.SENDER_NAME,
fax.SUBJECT,
fax.WORKGROUP_ID,
fax.LOCKED_TIME,
src.DESCRIPTION,
src.FAX_NUMBER,
src.WORKFLOW_ID,
fax.CREATED_BY,
fax.CREATED_DATE,
fax.UPDATE_DATE,
fax.UPDATED_BY,
fax.RESERVED_BY,
fax.PRICE_TO_ORDER,
fax.SKU_COUNT_TO_ORDER,
NVL (ORL.GET_FTH_WTR (fax.LAST_TRANSITION_ID).CHANGED_BY,
CASE
WHEN fax.LAST_TRANSITION_ID IS NULL
AND fax.GENIFAX_RECIPIENT_ID IS NOT NULL
THEN
'ORL FEEDER'
ELSE
'Admin'
END)
AS LAST_USER,
FROM_TZ (
NVL (ORL.GET_FTH_WTR (fax.LAST_TRANSITION_ID).CHANGED_DATE,
fax.DATE_RECEIVED),
'UTC')
AT TIME ZONE fax.LOCAL_TZ_NAME
AS MOVE_DATETIME,
NVL (ORL.GET_FTH_WTR (fax.LAST_TRANSITION_ID).REASON,
'Reroute')
AS MOVE_REASON,
NVL (
(SELECT fw.DESCRIPTION
FROM ORL.WORKGROUP_TRANSITION wt, ORL.WORKGROUP fw
WHERE wt.ID =
ORL.GET_FTH_WTR (fax.LAST_TRANSITION_ID).WORKGROUP_TRANSITION_ID
AND fw.ID = wt.CURRENT_WORKGROUP_ID),
CASE
WHEN fax.LAST_TRANSITION_ID IS NULL
AND fax.GENIFAX_RECIPIENT_ID IS NOT NULL
THEN
'ORL FEEDER STAGING'
ELSE
'N/A'
END)
AS OLD_STATUS,
(SELECT MAX (PURCHASE_ORDER_NUMBER)
FROM ORL.FAX_OFFER_DETAIL
WHERE FAX_ID = fax.ID)
AS MAXPO,
(SELECT CASE COUNT (PURCHASE_ORDER_NUMBER)
WHEN 0 THEN NULL
ELSE COUNT (PURCHASE_ORDER_NUMBER)
END
AS POCOUNT
FROM ORL.FAX_OFFER_DETAIL
WHERE FAX_ID = fax.ID)
AS POCOUNT,
(SELECT SUM (VALUE) AS ORDER_VALUE
FROM ORL.FAX_OFFER_DETAIL
WHERE FAX_ID = fax.ID)
AS ORDER_VALUE,
fax.SALESPERSON_NAME,
fax.GROUP_NAME,
fax.ROLE_NAME,
fax.EMAIL,
fax.SALES_CHANNEL
FROM (SELECT fax.*,
map.ORACLE_TZ_NAME AS LOCAL_TZ_NAME,
ORL.GET_SALESPERSON (map.ORG_ID, fax.SALES_PERSON).SALESPERSON_NAME
AS SALESPERSON_NAME,
ORL.GET_SALESPERSON (map.ORG_ID, fax.SALES_PERSON).GROUP_NAME
AS GROUP_NAME,
ORL.GET_SALESPERSON (map.ORG_ID, fax.SALES_PERSON).ROLE_NAME
AS ROLE_NAME,
ORL.GET_SALESPERSON (map.ORG_ID, fax.SALES_PERSON).EMAIL
AS EMAIL,
ORL.GET_SALESPERSON (map.ORG_ID, fax.SALES_PERSON).SALES_CHANNEL
AS SALES_CHANNEL
FROM APPS_GLOBAL.GLOBAL_BU_MAPPING map,
(SELECT *
FROM ORL.FAX_HEADER FH
WHERE FH.WORKGROUP_ID = 262) fax
WHERE map.GEDIS = 'Y'
AND map.BU_ID = (SELECT BUID
FROM ORL.WORKGROUP
WHERE ID = fax.WORKGROUP_ID)
AND ORL.GET_SALESPERSON (map.ORG_ID, fax.SALES_PERSON).SALESPERSON_NAME =
'A_CARRICK') fax,
(SELECT *
FROM ORL.FAX_SOURCE FS
WHERE FS.WORKFLOW_ID IN
(SELECT /*+ CARDINALITY(t, 1) */
TO_NUMBER (
COLUMN_VALUE)
AS COLUMN_VALUE
FROM TABLE (
SplitClob ('1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
96, 97, 98', ',')) t)) src
WHERE src.ID(+) = fax.FAX_SOURCE) FAX_LIST
WHERE RN BETWEEN 1 AND 100
ORDER BY RN ASC;[/code]
In my query the following three functions are using.
ORL.GET_FTH_WTR
ORL.GET_SALESPERSON
APPS_GLOBAL.SplitClob
[code]CREATE OR REPLACE FUNCTION ORL.GET_FTH_WTR(p_LAST_TRANSITION_ID NUMBER)
RETURN ORL.FTH_WTR_T
DETERMINISTIC
IS
v_REASON nvarchar2(1024 char);
v_WORKGROUP_TRANSITION_ID number;
v_CHANGED_BY nvarchar2(64 char);
v_CHANGED_DATE timestamp(6);
BEGIN
SELECT
WTR.REASON,
wtr.WORKGROUP_TRANSITION_ID,
fth.CHANGED_BY,
fth.CHANGED_DATE
INTO
v_REASON,
v_WORKGROUP_TRANSITION_ID,
v_CHANGED_BY,
v_CHANGED_DATE
FROM
ORL.FAX_TRANSITION_HISTORY fth,
ORL.WORKGROUP_TRANSITION_REASON wtr
WHERE
fth.ID = p_LAST_TRANSITION_ID
AND wtr.ID(+) = fth.TRANSITION_REASON_ID;
RETURN ORL.FTH_WTR_T(v_CHANGED_BY, v_CHANGED_DATE, v_REASON, v_WORKGROUP_TRANSITION_ID);
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN ORL.FTH_WTR_T(NULL, NULL, NULL, NULL);
END GET_FTH_WTR;
CREATE OR REPLACE function ORL.GET_SALESPERSON(ORG_ID number, SALESPERSON_ID number)
return ORL.SALESPERSON_T
deterministic
is
apps_bu varchar2(30);
salesperson_name varchar2(150 char);
email varchar2(70 char);
sales_channel varchar2(60 char);
role_name varchar2(60 char);
group_name varchar2(60 char);
begin
select OWNER_NAME into apps_bu
from APPS_GLOBAL.GLOBAL_BU_MAPPING
where ORG_ID = GET_SALESPERSON.ORG_ID;
execute immediate
replace('
select SALESPERSON_NAME
, EMAIL
, SALES_CHANNEL
, ROLE_NAME
, GROUP_NAME
from APPS_**.ORL_ACTIVE_SALESPERSON
where SALESPERSON_ID = :1
and rownum = 1
', 'APPS_**', apps_bu)
into salesperson_name, email, sales_channel, role_name, group_name
using SALESPERSON_ID;
return SALESPERSON_T(ORG_ID, SALESPERSON_ID, salesperson_name, email, sales_channel, role_name, group_name);
exception
when no_data_found then
return SALESPERSON_T(null, null, null, null, null, null, null);
end GET_SALESPERSON;
CREATE OR REPLACE function APPS_GLOBAL.SplitClob
p_clob clob
, p_delimiter varchar2 := ','
return StringTable
deterministic
pipelined
as
v_current_pos pls_integer := 1;
v_delimiter_pos pls_integer;
begin
if (p_clob is not NULL) and (p_delimiter is not NULL) then
while v_current_pos <= length(p_clob) loop
v_delimiter_pos := instr(p_clob, p_delimiter, v_current_pos);
if v_delimiter_pos < 1 then -- no more delimiters
v_delimiter_pos := length(p_clob) + 1;
end if;
pipe row( to_char( substr(p_clob,
v_current_pos,
v_delimiter_pos - v_current_pos) ) );
v_current_pos := v_delimiter_pos + length(p_delimiter);
end loop;
end if;
end SplitClob;
CREATE OR REPLACE TYPE SALESPERSON_T AS OBJECT
SALESPERSON_ID number(15)
, SALESPERSON_NUMBER varchar2(150 char)
, FIRST_NAME varchar2(20 char)
, LAST_NAME varchar2(40 char)
, SALES_CHANNEL varchar2(60 char)
, ORG_ID number(15)
, USER_NAME varchar2(61 char)
, EFFECTIVE_START_DATE date
, EFFECTIVE_END_DATE date
, STATUS_FLAG varchar2(1 char)
, EMAIL varchar2(70 char)
, WORK_TELEPHONE varchar2(60 char)
, MANAGERS_NAME varchar2(50 char)
, FAX_NO varchar2(60 char)
, SALESPERSON_NAME varchar2(30 char)
, TERRITORY varchar2(40 char)
, FO_LOGON varchar2(150 char)
, BO_LOGON varchar2(150 char)
, SUB_CHANNEL varchar2(25 char)
, BUSINESS_SEGMENT varchar2(3 char)
, DISCOUNT_NAME varchar2(30 char)
, RESPONSIBILITY_ID number
, RESPONSIBILITY_KEY varchar2(30 char)
CREATE OR REPLACE TYPE STRINGTABLE as table of varchar2(4000);[/code]
The total number of records in each table.
[code]SELECT COUNT(*) FROM ORL.FAX_HEADER FH --4397829
SELECT COUNT(*) FROM APPS_GLOBAL.GLOBAL_BU_MAPPING map --31
SELECT COUNT(*) FROM ORL.WORKGROUP_TRANSITION --6735
SELECT COUNT(*) FROM ORL.WORKGROUP fw --1495
SELECT COUNT(*) FROM ORL.FAX_OFFER_DETAIL --5904039
SELECT COUNT(*) FROM ORL.FAX_SOURCE--2368 --2457[/code]
Indexes on the columns.
[code]ORL.WORKGROUP_TRANSITION(ID),
ORL.WORKGROUP(ID),
ORL.FAX_OFFER_DETAIL(FAX_ID),
ORL.FAX_HEADER(WORKGROUP_ID).[/code]
Please help me to tune this query.
Thanks in advance.Hi,
Thanks for your reply.
For split the numbers into different rows , we are sending randomly.
It's not constant numbers.We have used bind variables.
For testing purpose I have hard coded the values.
How to do this split without using user defined function.
I am sending the actual query along with execution plan without any hints.
[code]SELECT FAX_LIST.*
FROM (SELECT ROW_NUMBER () OVER (ORDER BY fax.ID ASC) RN,
fax.ACCOUNT_TYPE,
fax.BU_FILE_LOCATION,
fax.COUNT_PAGES_RECEIVED,
NVL (fax.CUSTOMER_NAME, fax.SENDER_NAME) AS CUSTOMER_NAME,
fax.FAX_SOURCE,
fax.CUSTOMER_NUMBER,
fax.CUSTOMER_OMEGA_NUMBER,
fax.GENIFAX_RECIPIENT_ID,
fax.ID AS FAX_ID,
fax.DATE_RECEIVED AS FAX_RECEIVED,
fax.IS_LOCKED,
fax.LOCKED_BY,
fax.ORIGINATOR_CSI,
fax.MARGIN,
fax.PAYMENT_TYPE,
fax.PRIORITY_CODE,
fax.PRIORITY_VALUE,
FROM_TZ (fax.DATE_RECEIVED, 'UTC') AT TIME ZONE map.ORACLE_TZ_NAME AS DATE_RECEIVED,
fax.SALES_PERSON,
fax.SENDER_EMAIL,
fax.SENDER_NAME,
fax.SUBJECT,
fax.WORKGROUP_ID,
fax.LOCKED_TIME,
src.DESCRIPTION,
src.FAX_NUMBER,
src.WORKFLOW_ID,
fax.CREATED_BY,
fax.CREATED_DATE,
fax.UPDATE_DATE,
fax.UPDATED_BY,
fax.RESERVED_BY,
fax.PRICE_TO_ORDER,
fax.SKU_COUNT_TO_ORDER,
NVL (
ORL.GET_FTH_WTR (fax.LAST_TRANSITION_ID).CHANGED_BY,
CASE
WHEN fax.LAST_TRANSITION_ID IS NULL
AND fax.GENIFAX_RECIPIENT_ID IS NOT NULL
THEN
'ORL FEEDER'
ELSE
'Admin'
END
AS LAST_USER,
FROM_TZ (NVL (ORL.GET_FTH_WTR (fax.LAST_TRANSITION_ID).CHANGED_DATE,fax.DATE_RECEIVED),'UTC')
AT TIME ZONE map.ORACLE_TZ_NAME AS MOVE_DATETIME,
NVL (ORL.GET_FTH_WTR (fax.LAST_TRANSITION_ID).REASON,'Reroute')AS MOVE_REASON,
NVL ((SELECT fw.DESCRIPTION
FROM ORL.WORKGROUP_TRANSITION wt, ORL.WORKGROUP fw
WHERE wt.ID =
ORL.GET_FTH_WTR (
fax.LAST_TRANSITION_ID
).WORKGROUP_TRANSITION_ID
AND fw.ID = wt.CURRENT_WORKGROUP_ID),
CASE
WHEN fax.LAST_TRANSITION_ID IS NULL
AND fax.GENIFAX_RECIPIENT_ID IS NOT NULL
THEN
'ORL FEEDER STAGING'
ELSE
'N/A'
END
AS OLD_STATUS,
(SELECT MAX (PURCHASE_ORDER_NUMBER)
FROM ORL.FAX_OFFER_DETAIL
WHERE FAX_ID = fax.ID)
AS MAXPO,
(SELECT CASE COUNT (PURCHASE_ORDER_NUMBER)
WHEN 0 THEN NULL
ELSE COUNT (PURCHASE_ORDER_NUMBER)
END
AS POCOUNT
FROM ORL.FAX_OFFER_DETAIL
WHERE FAX_ID = fax.ID)
AS POCOUNT,
(SELECT SUM (VALUE) AS ORDER_VALUE
FROM ORL.FAX_OFFER_DETAIL
WHERE FAX_ID = fax.ID) AS ORDER_VALUE,
ORL.GET_SALESPERSON (map.ORG_ID,fax.SALES_PERSON).SALESPERSON_NAME AS SALESPERSON_NAME,
ORL.GET_SALESPERSON (map.ORG_ID,fax.SALES_PERSON).GROUP_NAME AS GROUP_NAME,
ORL.GET_SALESPERSON (map.ORG_ID,fax.SALES_PERSON).ROLE_NAME AS ROLE_NAME,
ORL.GET_SALESPERSON (map.ORG_ID, fax.SALES_PERSON).EMAIL AS EMAIL,
ORL.GET_SALESPERSON (map.ORG_ID, fax.SALES_PERSON).SALES_CHANNEL AS SALES_CHANNEL
FROM ORL.FAX_HEADER fax,
APPS_GLOBAL.GLOBAL_BU_MAPPING map,
ORL.FAX_SOURCE src
WHERE fax.WORKGROUP_ID = :WORKGROUP_ID
AND map.GEDIS = 'Y'
AND map.BU_ID = (SELECT BUID
FROM ORL.WORKGROUP
WHERE ID = fax.WORKGROUP_ID)
AND ORL.GET_SALESPERSON (map.ORG_ID,fax.SALES_PERSON).GROUP_NAME =:SALES_TEAM
AND ORL.GET_SALESPERSON (map.ORG_ID,fax.SALES_PERSON
).SALESPERSON_NAME = :SALESPERSON_NAME
AND src.WORKFLOW_ID IN
(SELECT TO_NUMBER (COLUMN_VALUE) AS COLUMN_VALUE
FROM table(SplitClob (:WORKFLOW_ID,:WORKFLOW_ID_delim)) t)
AND src.ID(+) = fax.FAX_SOURCE) FAX_LIST
WHERE RN BETWEEN 1 AND 100;
Execution Plan
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)|
| 0 | SELECT STATEMENT | | 2 | 12092 | 88923 (1)|
| 1 | NESTED LOOPS | | 1 | 38 | 3 (0)|
| 2 | TABLE ACCESS BY INDEX ROWID | WORKGROUP_TRANSITION | 1 | 9 | 2 (0)|
| 3 | INDEX UNIQUE SCAN | PK_WORKGROUP_TRANSITION | 1 | | 1 (0)|
| 4 | TABLE ACCESS BY INDEX ROWID | WORKGROUP | 1482 | 42978 | 1 (0)|
| 5 | INDEX UNIQUE SCAN | PK_WORKGROUP | 1 | | 0 (0)|
| 6 | SORT AGGREGATE | | 1 | 16 | |
| 7 | TABLE ACCESS BY INDEX ROWID | FAX_OFFER_DETAIL | 1 | 16 | 5 (0)|
| 8 | INDEX RANGE SCAN | FAX_OFFER_DETAIL_IDX1 | 1 | | 3 (0)|
| 9 | SORT AGGREGATE | | 1 | 16 | |
| 10 | TABLE ACCESS BY INDEX ROWID | FAX_OFFER_DETAIL | 1 | 16 | 5 (0)|
| 11 | INDEX RANGE SCAN | FAX_OFFER_DETAIL_IDX1 | 1 | | 3 (0)|
| 12 | SORT AGGREGATE | | 1 | 11 | |
| 13 | TABLE ACCESS BY INDEX ROWID | FAX_OFFER_DETAIL | 1 | 11 | 5 (0)|
| 14 | INDEX RANGE SCAN | FAX_OFFER_DETAIL_IDX1 | 1 | | 3 (0)|
| 15 | VIEW | | 2 | 12092 | 88923 (1)|
| 16 | WINDOW SORT PUSHED RANK | | 2 | 1378 | 88923 (1)|
| 17 | NESTED LOOPS | | | | |
| 18 | NESTED LOOPS | | 2 | 1378 | 88920 (1)|
| 19 | NESTED LOOPS | | 18420 | 11M| 70490 (1)|
| 20 | HASH JOIN RIGHT SEMI | | 69 | 3657 | 49 (3)|
| 21 | COLLECTION ITERATOR PICKLER FETCH| SPLITCLOB | 8168 | 16336 | 29 (0)|
| 22 | TABLE ACCESS FULL | FAX_SOURCE | 2409 | 119K| 19 (0)|
| 23 | TABLE ACCESS BY INDEX ROWID | FAX_HEADER | 268 | 160K| 2854 (1)|
| 24 | INDEX RANGE SCAN | FAX_HEADER_FS_IDX | 4345 | | 7 (0)|
| 25 | INDEX RANGE SCAN | GLOBAL_BU_MAPPING_BUID | 1 | | 0 (0)|
| 26 | TABLE ACCESS BY INDEX ROWID | WORKGROUP | 1 | 8 | 2 (0)|
| 27 | INDEX UNIQUE SCAN | PK_WORKGROUP | 1 | | 1 (0)|
| 28 | TABLE ACCESS BY INDEX ROWID | GLOBAL_BU_MAPPING | 1 | 24 | 1 (0)|
Note
- 'PLAN_TABLE' is old version
Statistics
894400 recursive calls
60 db block gets
7402741 consistent gets
0 physical reads
0 redo size
46309 bytes sent via SQL*Net to client
430 bytes received via SQL*Net from client
8 SQL*Net roundtrips to/from client
848304 sorts (memory)
0 sorts (disk)
100 rows processed[/code]
Please help me.
Thanks in advance. -
Scheduling of discoverer report via concurrent program or pl/sql code
Hi All,
I am beginner on Discoverer Report. As per my client requirements we need to do the scheduling of discoverer report rather than manually run it every week. Also we need to do this job by help of concurrent program or pl/sql code. But I don’t know how to scheduled the discoverer report.
Please any one help me or provide pl/sql code.
Thanks in Advance
Subhas SamantaThis is one of those questions that has been asked on the forum for years now and the answer really hasn't changed in that - command line using .BAT files, command line using VBasic (Rod's expertise) and Java potential via Plus.
You can search the forum for the fully documented answers to this but basically:
1. you can use Disco Desktop - NOT Plus or Viewer - with good ol' MS BAT files using the command line interface
2. you can use Disco Desktop - NOT Plus or Viewer - with good ol' MS BAT files using VBasic calls
3. I think - although never have seen - using Java command line interface to control it via a Java program
oh yah ...
4. if you're running Oracle Apps I believe you can get the Concurrent Manager to run the Disco report for you as well (another of Rod's expertises)
Russ
Edited by: RussProudman on Oct 30, 2008 2:40 PM -
Hi
I dont know anything about tuning
can anybody help to tune this query
SQL> set autotrace traceonly explain
SQL> select count(*) from ibs_x_t_receipts c
2 where exists
3 (Select 1 from ibs_s_i_doc_receipt a,ibs_x_t_bill b
4 where A.app_fr_doc_no = c.receipt_no
5 and a.app_to_doc_no = b.doc_no
6 and a.app_to_tr_type = 'TRN001'
7 and A.app_fr_tr_type = 'TRN002'
8 and b.bill_month <= '31-dec-2008'
9 and b.balance_ser_amt = 0
10 and b.balance_tax_amt = 0)
11 /
Execution Plan
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=212880 Card=1 Byte
s=21)
1 0 SORT (AGGREGATE)
2 1 NESTED LOOPS (Cost=212880 Card=1 Bytes=21)
3 2 VIEW OF 'VW_SQ_1' (VIEW) (Cost=212878 Card=1 Bytes=14)
4 3 HASH (UNIQUE)
5 4 NESTED LOOPS
6 5 NESTED LOOPS (Cost=212878 Card=1 Bytes=66)
7 6 VIEW OF 'index$_join$_002' (VIEW) (Cost=30021
Card=91387 Bytes=3564093)
8 7 HASH JOIN
9 8 INDEX (RANGE SCAN) OF 'SIDOC_INDX1' (INDEX
) (Cost=171215 Card=91387 Bytes=3564093)
10 8 INDEX (RANGE SCAN) OF 'SIDOC_INDX2' (INDEX
) (Cost=366130 Card=91387 Bytes=3564093)
11 6 INDEX (UNIQUE SCAN) OF 'ITL_PK2' (INDEX (UNIQU
E)) (Cost=1 Card=1)
12 5 TABLE ACCESS (BY INDEX ROWID) OF 'IBS_X_T_BILL'
(TABLE) (Cost=2 Card=1 Bytes=27)
13 2 INDEX (UNIQUE SCAN) OF 'RECEIPTS_PK2' (INDEX (UNIQUE))
(Cost=1 Card=1 Bytes=7)it is running like anything, i didn't get the result.
Please help me
kanish--untested
SELECT COUNT (*)
FROM ibs_x_t_receipts c
WHERE EXISTS (
SELECT 1
FROM ibs_s_i_doc_receipt a
WHERE a.app_fr_doc_no = c.receipt_no
AND a.app_to_tr_type = 'TRN001'
AND a.app_fr_tr_type = 'TRN002'
AND EXISTS (
SELECT 1
FROM ibs_x_t_bill b
WHERE a.app_to_doc_no = b.doc_no
AND b.bill_month <= '31-dec-2008'
AND b.balance_ser_amt = 0
AND b.balance_tax_amt = 0))regards,
friend
Edited by: most wanted!!!! on Apr 17, 2012 3:51 AM -
PL/SQL code written in db or in application...????
Hi ,
Which is the best...at performance , maintability... e.t.c.???
To write PL/SQL as validation process of data values going to be inserted in db:
1) as db trigger (before insert or update row-level trigger)
2) in application level - in Forms10g...
This PL/SQL code compares some pairs of data values only.... there DML statement....
Both db server and App server are considered to be or in the same machine or in two machines very close to each other...
Note: i use Db10g .
Thanks...
SimIt is all about moving parts. How many there are. Where they are located.
The less moving parts, the less the complexity, the bugs - and the better the performance (less wheels to turn to crunch data), the easier the maintenance and the better the flexibility.
Part of this is having the moving parts close to the data. Kind of obvious - what is faster? Shipping data from the db engine to a front-end application via a app server and web server? Or shipping the data from the db (SQL) engine to a PL/SQL process running as part and parcel of db instance? IPC is significantly faster than TCP/IP.
Having the moving parts close to the data also means that it can scale with the data. Oracle is good at scalability. It is designed at its very core to be scalable. Partitions to reduce I/O. Shared Server to reduce o/s resource footprint per client session. Shared pool to re-use SQL. DB buffer to cache data. RAC to run multiple db instances for a single physical database. Etc. Etc.
With the application moving parts being close to the data, it inherits this scalability. You can "multi-thread" application code using table pipelines. You have access to forking application code using background processes (DBMS_JOB and DBMS_SCHEDULER). You have bulk processing in order to transfer more data per SQL engine call, between the buffer cache and your application, and thus also reduce expensive context switching.
This list goes on and on.
All this is summarised into the following rules.
Rule 1. Do it in SQL.
Rule 2. Only when SQL cannot do it, use PL/SQL. (e.g. SQL is not suited for managing and controlling process flow - PL/SQL is)
Rule 3. Only when PL/SQL cannot do it, use <insert-language-here> (e.g. PL/SQL cannot render a Windows grid on the client - but Delphi/C#//Java can).
Also keep in mind that in the modern client-server paradigm we deal with a web architecture. Which means the client is a web browser. And this means that PL/SQL can pass the data (HTML) required by the client (web browser) to render the User Interface.
Have a look at APEX (Oracle's Application Express) for how this works. http://apex.oracle.com
All you need to develop web applications is APEX (a PL/SQL product suite in the database) and a web browser. Kickass stuff... :-) -
Hi,
I need a PL/SQL code for this one...
Let me know if something is not clear...
1) The table CLOB_CLOBJECT_CDA has the columns described below...
Explaining only those fields which are important in this context
-- CDA_STEP_ID : Basically a Sequence
-- CLOBJECT_SOURCE1_ID : Every id has got a set of records
-- CLOBJECT_SOURCE2_ID : Every id has got a set of records
-- LVL : There are total 8 levels..
This is the main aim :
1) There are total 16 million rows..(limited to 10 rows here)
2) We need to go through level by level (LVL column) & insert the intersection records (CLOBJECT_SOURCE1_ID intersect CLOBJECT_SOURCE2_ID)
into another table...but this is how it goes..
Level (LVL column) 3's basically have CLOBJECT_SOURCE1_ID as level (LVL column) 2 CDA_STEP_ID's..
(consider the statement --** where CLOBJECT_SOURCE1_ID = 285 which is same as 1st insert statement step id)..
The above process goes for next levels until 8..(so have to use loops)
So for ex :
We go through the first insert statement and insert the insertion records only when both CLOBJECT_SOURCE1_ID & CLOBJECT_SOURCE2_ID has got records ..
If we don't find any records for both of them we should skip the corresponding step id when we go to the next levels...
Let's go through the 1st insert statement...
-- We have CDA_STEP_ID = 285 & two sources CLOBJECT_SOURCE1_ID as 19 & CLOBJECT_SOURCE2_ID as 74...
-- We see the table CLOBJECT_COUNTS & check whether we have counts for both 19 & 74 ..(In fact we insert counts into this table only if they have records)
-- If so, we insert the intersection records into CDA_MRN_RESULTS ( we do have counts for both of them..) with CDA_STEP_ID 285...
-- Then we insert the step id which is 285 along with the count into CLOBJECT_COUNTS..
Let's go through another insert statement...
-- Consider CDA_STEP_ID = 288 which has two sources CLOBJECT_SOURCE1_ID as 19 & CLOBJECT_SOURCE2_ID as 92...
-- We see the table CLOBJECT_COUNTS & check whether we have counts for both 19 & 92 ..(we have records for 19 but not for 92)
-- So we should not proceed with this..& also skip all those records (future records with increasing levels..basically level 3's) which have got 288 as CLOBJECT_SOURCE1_ID..
(As said earlier that the present CDA_STEP_ID will always be CLOBJECT_SOURCE1_ID in the next level)...
I wrote the following code which is after the statement...
Let me have the create & insert statements here..
create table CLOB_CLOBJECT_CDA
CDA_STEP_ID NUMBER,
CDA_ID NUMBER,
CDA_SEQ_NUMBER NUMBER,
CLOBJECT_SOURCE1_TYPE VARCHAR2(3000),
CLOBJECT_SOURCE1_ID NUMBER,
CLOBJECT_OPERATOR VARCHAR2(3000),
CLOBJECT_SOURCE2_TYPE VARCHAR2(3000),
CLOBJECT_SOURCE2_ID NUMBER,
LVL NUMBER
insert into clob_clobject_cda (CDA_STEP_ID, CDA_ID, CDA_SEQ_NUMBER, CLOBJECT_SOURCE1_TYPE, CLOBJECT_SOURCE1_ID, CLOBJECT_OPERATOR, CLOBJECT_SOURCE2_TYPE, CLOBJECT_SOURCE2_ID, LVL)
values (285, 285, 1, 'CLOBJECT', 19, 'INTERSECT', 'CLOBJECT', 74, 2);
insert into clob_clobject_cda (CDA_STEP_ID, CDA_ID, CDA_SEQ_NUMBER, CLOBJECT_SOURCE1_TYPE, CLOBJECT_SOURCE1_ID, CLOBJECT_OPERATOR, CLOBJECT_SOURCE2_TYPE, CLOBJECT_SOURCE2_ID, LVL)
values (286, 286, 1, 'CLOBJECT', 19, 'INTERSECT', 'CLOBJECT', 75, 2);
insert into clob_clobject_cda (CDA_STEP_ID, CDA_ID, CDA_SEQ_NUMBER, CLOBJECT_SOURCE1_TYPE, CLOBJECT_SOURCE1_ID, CLOBJECT_OPERATOR, CLOBJECT_SOURCE2_TYPE, CLOBJECT_SOURCE2_ID, LVL)
values (287, 287, 1, 'CLOBJECT', 19, 'INTERSECT', 'CLOBJECT', 91, 2);
insert into clob_clobject_cda (CDA_STEP_ID, CDA_ID, CDA_SEQ_NUMBER, CLOBJECT_SOURCE1_TYPE, CLOBJECT_SOURCE1_ID, CLOBJECT_OPERATOR, CLOBJECT_SOURCE2_TYPE, CLOBJECT_SOURCE2_ID, LVL)
values (288, 288, 1, 'CLOBJECT', 19, 'INTERSECT', 'CLOBJECT', 92, 2);
insert into clob_clobject_cda (CDA_STEP_ID, CDA_ID, CDA_SEQ_NUMBER, CLOBJECT_SOURCE1_TYPE, CLOBJECT_SOURCE1_ID, CLOBJECT_OPERATOR, CLOBJECT_SOURCE2_TYPE, CLOBJECT_SOURCE2_ID, LVL)
values (4869, 4869, 1, 'CDA_STEP', 285, 'INTERSECT', 'CLOBJECT', 91, 3); -- **
insert into clob_clobject_cda (CDA_STEP_ID, CDA_ID, CDA_SEQ_NUMBER, CLOBJECT_SOURCE1_TYPE, CLOBJECT_SOURCE1_ID, CLOBJECT_OPERATOR, CLOBJECT_SOURCE2_TYPE, CLOBJECT_SOURCE2_ID, LVL)
values (4870, 4870, 1, 'CDA_STEP', 285, 'INTERSECT', 'CLOBJECT', 92, 3);
insert into clob_clobject_cda (CDA_STEP_ID, CDA_ID, CDA_SEQ_NUMBER, CLOBJECT_SOURCE1_TYPE, CLOBJECT_SOURCE1_ID, CLOBJECT_OPERATOR, CLOBJECT_SOURCE2_TYPE, CLOBJECT_SOURCE2_ID, LVL)
values (4871, 4871, 1, 'CDA_STEP', 285, 'INTERSECT', 'CLOBJECT', 93, 3);
insert into clob_clobject_cda (CDA_STEP_ID, CDA_ID, CDA_SEQ_NUMBER, CLOBJECT_SOURCE1_TYPE, CLOBJECT_SOURCE1_ID, CLOBJECT_OPERATOR, CLOBJECT_SOURCE2_TYPE, CLOBJECT_SOURCE2_ID, LVL)
values (4880, 4880, 1, 'CDA_STEP', 286, 'INTERSECT', 'CLOBJECT', 91, 3);
insert into clob_clobject_cda (CDA_STEP_ID, CDA_ID, CDA_SEQ_NUMBER, CLOBJECT_SOURCE1_TYPE, CLOBJECT_SOURCE1_ID, CLOBJECT_OPERATOR, CLOBJECT_SOURCE2_TYPE, CLOBJECT_SOURCE2_ID, LVL)
values (4881, 4881, 1, 'CDA_STEP', 286, 'INTERSECT', 'CLOBJECT', 92, 3);
insert into clob_clobject_cda (CDA_STEP_ID, CDA_ID, CDA_SEQ_NUMBER, CLOBJECT_SOURCE1_TYPE, CLOBJECT_SOURCE1_ID, CLOBJECT_OPERATOR, CLOBJECT_SOURCE2_TYPE, CLOBJECT_SOURCE2_ID, LVL)
values (4882, 4882, 1, 'CDA_STEP', 286, 'INTERSECT', 'CLOBJECT', 93, 3);
create table CDA_MRN_RESULTS
CDA_STEP_ID NUMBER,
MRN NUMBER,
INSERT_DATE_TIME DATE
insert into cda_mrn_results (CDA_STEP_ID, MRN, INSERT_DATE_TIME)
values (19, 1, to_date('19-10-2011', 'dd-mm-yyyy'));
insert into cda_mrn_results (CDA_STEP_ID, MRN, INSERT_DATE_TIME)
values (19, 2, to_date('19-10-2011', 'dd-mm-yyyy'));
insert into cda_mrn_results (CDA_STEP_ID, MRN, INSERT_DATE_TIME)
values (19, 3, to_date('19-10-2011', 'dd-mm-yyyy'));
insert into cda_mrn_results (CDA_STEP_ID, MRN, INSERT_DATE_TIME)
values (74, 1, to_date('19-10-2011', 'dd-mm-yyyy'));
insert into cda_mrn_results (CDA_STEP_ID, MRN, INSERT_DATE_TIME)
values (74, 2, to_date('19-10-2011', 'dd-mm-yyyy'));
insert into cda_mrn_results (CDA_STEP_ID, MRN, INSERT_DATE_TIME)
values (74, 4, to_date('19-10-2011', 'dd-mm-yyyy'));
insert into cda_mrn_results (CDA_STEP_ID, MRN, INSERT_DATE_TIME)
values (75, 1, to_date('19-10-2011', 'dd-mm-yyyy'));
insert into cda_mrn_results (CDA_STEP_ID, MRN, INSERT_DATE_TIME)
values (75, 2, to_date('19-10-2011', 'dd-mm-yyyy'));
insert into cda_mrn_results (CDA_STEP_ID, MRN, INSERT_DATE_TIME)
values (75, 6, to_date('19-10-2011', 'dd-mm-yyyy'));
insert into cda_mrn_results (CDA_STEP_ID, MRN, INSERT_DATE_TIME)
values (91, 2, to_date('19-10-2011', 'dd-mm-yyyy'));
insert into cda_mrn_results (CDA_STEP_ID, MRN, INSERT_DATE_TIME)
values (91, 3, to_date('19-10-2011', 'dd-mm-yyyy'));
create table CLOBJECT_COUNTS
CDA_STEP_ID NUMBER,
CLOBJECT_COUNT NUMBER,
DATE_TIME DATE
Insert into CLOBJECT_COUNTS values (19,3, to_date('19-10-2011', 'dd-mm-yyyy'));
Insert into CLOBJECT_COUNTS values (74,3, to_date('19-10-2011', 'dd-mm-yyyy'));
Insert into CLOBJECT_COUNTS values (75,3, to_date('19-10-2011', 'dd-mm-yyyy'));
Insert into CLOBJECT_COUNTS values (91,2, to_date('19-10-2011', 'dd-mm-yyyy'));The output goes into two tables...
CDA_MRN_RESULTS : O/p of intersection records between source1 & source2 id
CLOBJECT_COUNTS : Step id with counts ...(useful for skipping next level step id's if either of source id has "0" counts)
Any help is appreciated..
Thanks..I tried to code this..but looping takes a lot of time..I want to skip certain rows where source1_step_id & source_2_step_id are not in clobject_counts table as we proceed to the next levels..Not sure how to skip the rows..
declare
cursor c1 (p_level varchar2 ) is
Select * from clob_clobject_cda
where lvl = p_level ;
TYPE V_TT IS TABLE OF C1%ROWTYPE INDEX BY PLS_INTEGER;
L_TT V_TT;
v1 number;
v2 number;
v_step_id number;
v_operator varchar2(100) := '';
begin
for i in 2..8 loop
open c1(i);
LOOP
FETCH C1 BULK COLLECT INTO L_TT LIMIT 500;
FOR indx IN 1 .. L_TT.COUNT
LOOP
v1 := L_TT(indx).clobject_source1_id;
v2 := L_TT(indx).clobject_source2_id;
v_step_id := L_TT(indx).cda_step_id;
v_operator := L_TT(indx).clobject_operator;
Execute Immediate ('Insert into cda_mrn_results Select --+ parallel (cm 128)
distinct ' || v_step_id || ', mrn, trunc(sysdate) dt from cda_mrn_results cm
where cda_step_id = ' || v1 || '
and cda_step_id in (Select cda_step_id from clobject_counts) ' ||
v_operator ||
' Select --+ parallel (cm 128)
distinct ' || v_step_id || ', mrn, trunc(sysdate) dt from cda_mrn_results cm
where cda_step_id = ' || v2 || '
and cda_step_id in (Select cda_step_id from clobject_counts) ' );
Insert --+ Append
into clobject_counts Select cda_step_id, count(distinct mrn),
insert_date_time dt from cda_mrn_results where cda_step_id = v_step_id group by cda_step_id,insert_date_time;
COMMIT;
END LOOP;
EXIT WHEN L_TT.COUNT = 0;
END LOOP;
CLOSE C1;
End Loop;
Commit;
End;
Maybe you are looking for
-
Hi we do have the following situation on computer A there is a Excel Document Addin development project , Visual Studio 2012, Office 2010 installed. All works fine. we would like to bring the project to another machine with Visual Studio 2012, but O
-
In the Pages Program template on the 4 column page a text is wrapped around a violinist. How do I have to prepare the photo to have a similar result. Thanks
-
Error message when doing HCM "change employee salary" on portal
Hi experts, We have a problem when user did the "salary change" HCM form on HR portal. We checked the workflow log by SWIA, work item 23546, and there are error messages described as below: Error when processing node '0000000005' (ParForEach
-
How to get activity and participant of next interactive activity
I am trying to get the activity name and participants of the next activity of the current activity. How to do that? Should I use PAPI or PBL?
-
Hi I am running a custom Concurrent Program, where in if get terminated by clicking cancel request button, i want to update a custom table column in the database. It would be great if any one give some suggestion