Reputation: 2209
I have below oracle query. It is taking very long time to run. Can you please suggest some performance tuning for this query.
select ss.registration_id as REGISTRATION_ID,
ss.batch_id as BATCH_ID
from submtd_srvc PARTITION(SUBMTD_SRVC_821370) ss,
(select a.exceptn_criteria_val,
a.exceptn_criteria_rtrn_val
from EXCEPTN_CRITERIA a,
EXCEPTN_EXPRESSION b
where a.EXCEPTN_EXPRESSION_ID = b.EXCEPTN_EXPRESSION_ID
and b.EXCEPTN_EXPRESSION_NAME = 'NC_CUSTOM_REV_CAT'
and b.IS_CURRENT_INDCTR = 1
and a.IS_CURRENT_INDCTR = 1) sub_query
where ss.REVENUE_CD = sub_query.exceptn_criteria_val
and ss.batch_id = 821370
and exists (select 'x'
from submtd_srvc PARTITION(SUBMTD_SRVC_821370) ss2,
(select a.exceptn_criteria_val,
a.exceptn_criteria_rtrn_val
from EXCEPTN_CRITERIA a,
EXCEPTN_EXPRESSION b
where a.EXCEPTN_EXPRESSION_ID = b.EXCEPTN_EXPRESSION_ID
and b.EXCEPTN_EXPRESSION_NAME = 'NC_CUSTOM_REV_CAT'
and b.IS_CURRENT_INDCTR = 1
and a.IS_CURRENT_INDCTR = 1) sub_query2
where ss2.REVENUE_CD = sub_query2.exceptn_criteria_val
and ss2.registration_id = ss.registration_id
and ss2.batch_id = ss.batch_id
and ss2.batch_id = 821370
and sub_query2.exceptn_criteria_rtrn_val <> sub_query.exceptn_criteria_rtrn_val)
Order By Ss.Registration_Id,
ss.batch_id;
Upvotes: 0
Views: 444
Reputation: 167972
You can replace the EXISTS
with GROUP BY
and HAVING
:
SELECT ss.registration_id,
ss.batch_id
FROM submtd_srvc PARTITION(SUBMTD_SRVC_821370) ss
INNER JOIN
EXCEPTN_CRITERIA a
ON ( ss.REVENUE_CD = a.exceptn_criteria_val )
INNER JOIN
EXCEPTN_EXPRESSION b
ON ( a.EXCEPTN_EXPRESSION_ID = b.EXCEPTN_EXPRESSION_ID )
WHERE b.EXCEPTN_EXPRESSION_NAME = 'NC_CUSTOM_REV_CAT'
AND b.IS_CURRENT_INDCTR = 1
AND a.IS_CURRENT_INDCTR = 1
AND ss.batch_id = 821370
GROUP BY
ss.Registration_Id,
ss.batch_id
HAVING COUNT( DISTINCT a.exceptn_criteria_rtrn_val ) = 1
ORDER BY
ss.Registration_Id,
ss.batch_id;
I've also got rid of all the sub-queries and used ANSI standard joins rather than the legacy Oracle joins.
Upvotes: 1
Reputation: 494
If I understood correctly you use correlation subquery for finding rows with more than one distinct exceptn_criteria_rtrn_val value. If I'm right will be better use analytic function:
select vw.registration_id as REGISTRATION_ID, vw.batch_id as BATCH_ID
from
(select ss.registration_id as REGISTRATION_ID, ss.batch_id as BATCH_ID
,count(distinct sub_query.exceptn_criteria_rtrn_val) over(partition by ss.registration_id, ss.batch_id) as cnt
from submtd_srvc PARTITION(SUBMTD_SRVC_821370) ss,
(select a.exceptn_criteria_val, a.exceptn_criteria_rtrn_val
from EXCEPTN_CRITERIA a, EXCEPTN_EXPRESSION b
where a.EXCEPTN_EXPRESSION_ID = b.EXCEPTN_EXPRESSION_ID
and b.EXCEPTN_EXPRESSION_NAME = 'NC_CUSTOM_REV_CAT'
and b.IS_CURRENT_INDCTR = 1
and a.IS_CURRENT_INDCTR = 1) sub_query
where ss.REVENUE_CD = sub_query.exceptn_criteria_val
and ss.batch_id = 821370) vw
where cnt > 1
Order By vw.Registration_Id, vw.batch_id;
Upvotes: 2