0

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

这些桌子很大!有没有可用的优化?

4

2 回答 2

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 会自动将整个事情重写为内部连接。

最后,在不了解您的数据和您正在尝试做什么的情况下,我建议您尽可能少地尝试使用视图 - 如果您可以查询下属表,那将是最好的,您可能会立即看到性能提升.

于 2013-02-10T08:25:09.270 回答
0

在不了解您的表或视图定义、索引等的情况下,我将首先查看子选择并确保它们以最佳方式执行。我还想知道每个子选择返回了多少值,因为这会影响性能。

compute_context_key 如何用于从 V_COUNTRY_DERIV_PSN 和 V_PSN_COUNTRY 检索行?是最优的执行计划吗?

如何在 V_COUNTRY_DERIV_SUMMARY_XREF 中使用 DERIV_POSITION_KEY 和 CALC_OBLIGOR_COUNTRY_OF_ASSETS 来检索行?再次,查看解释计划。

于 2013-02-05T15:28:30.073 回答