Oracle Sub-select需要很长时间

时间:2013-02-05 15:11:09

标签: sql performance oracle optimization

我有一个包含两级子选择的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
                )
           )

这些表格很大!有没有可用的优化?

2 个答案:

答案 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会自动执行此操作,并将整个内容重写为内部联接。

最后,在没有任何关于你的数据以及你想要做什么的任何知识的情况下,我建议你尽可能少地尝试使用视图 - 如果你可以查询底层表,那将是最好的,你可能会看到立即改善绩效。