我有一个包含两级子选择的SQL查询。这花费了太多时间。
查询如下:
select * from DALDBO.V_COUNTRY_DERIV_SUMMARY_XREF
where calculation_context_key = 130205268077
and DERIV_POSITION_KEY in
(select ctry_risk_derivs_psn_key
from DALDBO.V_COUNTRY_DERIV_PSN
where calculation_context_key = 130111216755
--and ctry_risk_derivs_psn_key = 76296412
and CREDIT_PRODUCT_TYPE = 'SWP OP'
and CALC_OBLIGOR_COUNTRY_OF_ASSETS in
(select ctry_cd
from DALDBO.V_PSN_COUNTRY
where calculation_context_key = 130134216755
--and ctry_risk_derivs_psn_key = 76296412
)
)
这些表格很大!有没有可用的优化?
答案 0 :(得分:0)
在不了解您的表或视图定义,索引等的任何信息的情况下,我将首先查看子选择并确保它们以最佳方式执行。我还想知道每个子选择返回多少个值,因为这会影响性能。
如何使用calculate_context_key从V_COUNTRY_DERIV_PSN和V_PSN_COUNTRY中检索行?这是一个最佳的执行计划吗?
如何在V_COUNTRY_DERIV_SUMMARY_XREF中使用DERIV_POSITION_KEY和CALC_OBLIGOR_COUNTRY_OF_ASSETS来检索行?再看一下解释计划。
答案 1 :(得分:0)
首先,您可以使用内部联接(而不是子选择)来编写此查询吗?
select A.*
from DALDBO.V_COUNTRY_DERIV_SUMMARY_XREF a,
DALDBO.V_COUNTRY_DERIV_PSN b,
DALDBO.V_PSN_COUNTRY c
where calculation_context_key = 130205268077
and a.DERIV_POSITION_KEY = b.ctry_risk_derivs_psn_key
and b.calculation_context_key = 130111216755
--and b.ctry_risk_derivs_psn_key = 76296412
and b.CREDIT_PRODUCT_TYPE = 'SWP OP'
and b.CALC_OBLIGOR_COUNTRY_OF_ASSETS = c.ctry_cd
and c.calculation_context_key = 130134216755
--and c.ctry_risk_derivs_psn_key = 76296412
第二,最佳实践表明,当您不从子选择中的表中查询任何数据时,最好使用EXISTS而不是IN。新版本的oracle会自动执行此操作,并将整个内容重写为内部联接。
最后,在没有任何关于你的数据以及你想要做什么的任何知识的情况下,我建议你尽可能少地尝试使用视图 - 如果你可以查询底层表,那将是最好的,你可能会看到立即改善绩效。