【发布时间】:2013-02-05 15:11:08
【问题描述】:
我有一个包含两级子选择的 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
)
)
这些桌子很大!有没有可用的优化?
【问题讨论】:
-
信息太少了。架构是什么?现有的索引是什么?查询计划是什么样的?在这种情况下,什么是“巨大”?此外,您的查询不完整,它至少缺少一个结束括号(注释掉的那个?)
-
1.所有这些模式都在主键上建立索引。就像 V_COUNTRY_DERIV_SUMMARY_XREF 有 V_COUNTRY_DERIV_SUMMARY_XREF_key 2。我们可以忽略这个表:DALDBO.V_PSN_COUNTRY。其他两个都比较大 3. 查询计划我不确定。
-
为什么不加入? (而不是子选择)。但正如 Joachim 所说,信息太少了
-
在过去的 6-7 个月里,我们每天在这些表中输入近百万条记录!!!
-
@Vivek 我们猜不出你的主键是什么,所以告诉我们这些表是在主键上索引的并不能告诉我们太多。您的表名也以
V_开头,这让我想知道,这些表或视图是这些表还是视图(因为许多地方倾向于使用v_表示视图)。您的表是否有一个索引,涵盖了您在此处过滤的所有列以及每个子选择会产生多少行)?
标签: sql performance oracle optimization