0

2つのレベルの副選択で構成される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

次に、ベストプラクティスでは、副選択のテーブルからデータをクエリしない場合は、INの代わりにEXISTSを使用する方が適切です。新しいバージョンのOracleは、これを自動的に実行し、実際にすべてを内部結合として書き換えます。

最後に、データと何をしようとしているのかについての知識がなくても、ビューをできるだけ少なくして使用することをお勧めします-基になるテーブルにクエリを実行できる場合は、それが最善であり、おそらくすぐにパフォーマンスが向上します。

于 2013-02-10T08:25:09.270 に答える
0

テーブルやビューの定義、インデックス作成などについて何も知らなくても、まずは副選択を見て、それらが最適に機能していることを確認します。また、パフォーマンスに影響を与える可能性があるため、各副選択によって返される値の数も知りたいと思います。

計算_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 に答える