Oracle性能调整
我有下面的oracle查询。它需要很长时间才能运行。您能为这个查询建议一些性能调整吗Oracle性能调整,oracle,performance,oracle11g,Oracle,Performance,Oracle11g,我有下面的oracle查询。它需要很长时间才能运行。您能为这个查询建议一些性能调整吗 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
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;
如果我理解正确,您可以使用关联子查询查找具有多个不同exceptn_criteria_rtrn_val值的行。如果我是对的,将更好地使用分析函数:
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;
如果我理解正确,您可以使用关联子查询查找具有多个不同exceptn_criteria_rtrn_val值的行。如果我是对的,将更好地使用分析函数:
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;
您可以将EXISTS替换为GROUP BY,并具有:
我还删除了所有子查询,并使用了ANSI标准联接,而不是传统的Oracle联接。您可以用GROUP BY和HAVING替换EXISTS:
我还去掉了所有的子查询,并使用了ANSI标准联接,而不是传统的Oracle联接。如果您可以发布解释计划以及表和索引的结构,这将非常有用。我个人将去掉exists子句并使用join。在我的情况下,它工作得更快。除此之外,请查看解释计划,并找到您在哪里进行全表扫描。如果可能的话,为它们创建索引。发布查询通常没有足够的信息;你可能会发现一些你应该发布的提示。如果你可以发布你的解释计划以及你的表和索引的结构,这将是非常有用的。我个人会去掉exists子句并使用join。在我的情况下,它工作得更快。除此之外,请查看解释计划,并找到您在哪里进行全表扫描。如果可能的话,为它们创建索引。发布查询通常没有足够的信息;你可能会发现一些你应该发布的提示。