性能调优

patrickpan 2010-04-21 03:15:11
以下是存储过程的一部分,共涉及到四个表,
表名 -- 数据量
HISTOMVTS_REPORTING -- 6215520
SPB_SWAP -- 1743
SPBR_EQUITY_SCHEDULE -- 36885
SPB_INTEREST_PERIOD -- 43753
执行完要十几分钟,请问如何优化?我对Oracle确实不熟。多谢各位给出建议

[Code=sql]
SELECT
S.ID AS Swap_Id,
(CASE WHEN h.TYPE IN (25,102,7)
THEN
ses.RESET_DATE
WHEN h.TYPE = 101 AND H.DATENEG = ses.RESET_DATE
THEN
ses.RESET_DATE
WHEN h.TYPE = 101 AND H.DATENEG <> ses.RESET_DATE
THEN
H.DATENEG
ELSE
NULL END) AS Equity_Reset_Date,
(CASE WHEN h.TYPE = 101 AND H.DATENEG <> ses.RESET_DATE
THEN
'Y'
ELSE
'N' END) AS Trade_Level_Reset,
NULL AS INTEREST_Reset_Date,
H.DATEVAL AS Pay_Date,
-- Equity PnL
SUM(CASE WHEN h.TYPE = 101
THEN
-Montant_Swap_Ccy
ELSE
0 END) AS Equity_Pnl,
-- Realised PnL
SUM(CASE WHEN h.TYPE = 25
AND (h.dateneg BETWEEN ses.start_date AND ses.reset_date )
AND ses.Trading_Gain_Pay_Rule = 'NEQR'
THEN
-Montant_Swap_Ccy
ELSE
0 END) AS Realised_Pnl,
-- Dividend
SUM(CASE WHEN h.TYPE = 102
AND (h.DATEVAL = nvl(ses.reset_pay_date, ses.end_date))
AND (ses.DIV_PAY_RULE = 'EQRMP')
THEN
Montant_Swap_Ccy
ELSE
0 END ) AS Dividend_Pnl,
-- Commission
SUM(CASE WHEN h.TYPE = 7
AND (h.dateneg BETWEEN ses.start_date AND ses.reset_date)
THEN
-Montant_Swap_Ccy
ELSE
0 END) AS Commission_Pnl,
-- Interest Reset Amount

0 AS Equity_Reset_Amount,

0 AS Div_Re_Reset_Pnl,
0 AS Rld_Re_Reset_Pnl,
0 AS Interest_Reset_Amount
FROM
HISTOMVTS_REPORTING H, SPB_SWAP S, SPBR_EQUITY_SCHEDULE SES
WHERE
H.SWAP_ID = S.ID
AND H.TYPE IN (101,25,102,7)
AND S.ID = SES.Series_Id
AND ((H.DateNeg BETWEEN SES.start_date AND SES.reset_date)
OR (H.DATEVAL = nvl(ses.reset_pay_date, ses.end_date) AND H.TYPE = 102))
AND NVL(P_SERIES_ID, S.ID) = S.ID -- Filter Related Clauses Below
AND NVL(P_FUND_ID, S.FUND_ID) = S.FUND_ID
AND NVL(P_INSTRUMENT_ID,H.INSTRUMENT_ID) = H.INSTRUMENT_ID
AND NVL(P_TRADE_DATE_FROM, ses.RESET_DATE) <= ses.RESET_DATE
AND NVL(P_TRADE_DATE_TO,ses.RESET_DATE) >= ses.RESET_DATE
AND NVL(P_VALUE_DATE_FROM, H.DATEVAL) <= H.DATEVAL
AND NVL(P_VALUE_DATE_TO, H.DATEVAL) >= H.DATEVAL
AND decode(P_CASHFLOW_TYPE, '0', Series_Id, 'EQ', Series_Id, 'INT', -9999, NULL, Series_Id, -9999) = Series_Id
GROUP BY
S.ID ,
SES.RESET_DATE ,
H.DATENEG ,
H.DATEVAL ,
H.TYPE

UNION ALL

SELECT
S.ID AS Swap_Id,
NULL AS Equity_Reset_Date,
'N' AS Trade_Level_Reset,
(CASE WHEN h.TYPE IN (100, 180, 200, 220, 221, 260, 280, 281)
THEN
H.DATENEG
ELSE
NULL END) AS INTEREST_Reset_Date,
H.DATEVAL AS Pay_Date,
0 AS Equity_Pnl,
0 AS Realised_Pnl,
0 AS Dividend_Pnl,
0 AS Commission_Pnl,
0 AS Equity_Reset_Amount,
SUM(CASE WHEN h.TYPE = 220
-- AND h.dateneg = ip.reset_date
THEN
h.Montant_Swap_Ccy
ELSE
0 END) AS Div_Re_Reset_Pnl,
SUM(CASE WHEN h.TYPE = 221
-- AND h.dateneg = ip.reset_date
THEN
h.Montant_Swap_Ccy
ELSE
0 END) AS Rld_Re_Reset_Pnl,
-- Interest Reset Amount
SUM(CASE WHEN h.TYPE IN (100, 180, 200, 220, 221, 260, 280, 281)
AND h.dateneg = ip.reset_date
THEN
h.Montant_Swap_Ccy
ELSE
0 END) AS Interest_Reset_Amount
FROM
HISTOMVTS_REPORTING H, SPB_SWAP S, SPB_INTEREST_PERIOD ip
WHERE
H.SWAP_ID = S.ID
AND H.TYPE IN (100, 180, 200, 220, 221, 260, 280, 281)
AND NVL(P_SERIES_ID, S.ID) = S.ID -- Filter Related Clauses Below
AND NVL(P_FUND_ID, S.FUND_ID) = S.FUND_ID
AND NVL(P_INSTRUMENT_ID,H.INSTRUMENT_ID) = H.INSTRUMENT_ID
AND NVL(P_VALUE_DATE_FROM, H.DATEVAL) <= H.DATEVAL
AND NVL(P_VALUE_DATE_TO, H.DATEVAL) >= H.DATEVAL
AND NVL(P_TRADE_DATE_FROM, ip.reset_date)<= ip.reset_date
AND NVL(P_TRADE_DATE_TO, ip.reset_date) >= ip.reset_date
AND H.DATENEG >= ip.START_DATE
AND H.DATENEG < ip.END_DATE
AND ip.swap_id = s.ID
AND decode(P_CASHFLOW_TYPE, '0', ip.Swap_ID, 'INT', ip.Swap_ID, 'EQ', -9999, NULL, ip.Swap_ID, -9999) = ip.Swap_ID
GROUP BY
S.ID ,
H.DATENEG ,
H.DATEVAL ,
H.TYPE
[/Code]
...全文
78 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
patrickpan 2010-04-21
  • 打赏
  • 举报
回复
多谢各位,这个性能问题不要我搞了。结贴。
playumen 2010-04-21
  • 打赏
  • 举报
回复
将in用exists,nul用decode试下,应该速度会快点.
you_tube 2010-04-21
  • 打赏
  • 举报
回复
NVL改掉,还有decode
iqlife 2010-04-21
  • 打赏
  • 举报
回复
你这里有个UNION,先确定哪段SQL语句执行的慢,还是两者都慢,
看到你在WHERE 子句里使用了IN,还有NVL函数,都会减慢查询速度
patrickpan 2010-04-21
  • 打赏
  • 举报
回复
您好,没有执行计划,是在客户端程序中直接调用.
iqlife 2010-04-21
  • 打赏
  • 举报
回复
执行计划贴出来看看,看能帮忙不

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧