阅读 206

update修改为merge(max+decode)

------------ 优化方法: 减少大表扫描次数采用max+decode方式

 

原sql语句:

UPDATE RKO_ACCT_STATUS A SET RMB_PAYMENT = (SELECT NVL(SUM(POSTING_AMT), 0) FROMRKOT_ACCT_PMT_PRIOR B WHERE B.ACCT = A.ACCT AND ORG = '242' AND POSTING_DATE BETWEENA.PRIOR_BILLING_DATE + 1 AND ADD_MONTHS(A.PRIOR_BILLING_DATE, 1) AND TXN_DATE <= (SELECT CASEWHEN USER_DATE_10=0 THEN NULL ELSE TO_DATE(USER_DATE_10, 'yyyyddd') END FROMRKOH_HAPS_AMBS_KD WHERE ACCT = A.ACCT AND ORG = 242 AND BATCH_DATE =TO_CHAR(LAST_DAY(A.PRIOR_BILLING_DATE),'yyyymmdd')) + 0.99999), USD_PAYMENT = (SELECTNVL(SUM(POSTING_AMT), 0) FROM RKOT_ACCT_PMT_PRIOR B WHERE B.ACCT = A.ACCT AND ORG = '241' ANDPOSTING_DATE BETWEEN A.PRIOR_BILLING_DATE + 1 AND ADD_MONTHS(A.PRIOR_BILLING_DATE, 1) ANDTXN_DATE <= (SELECT CASE WHEN USER_DATE_10=0 THEN NULL ELSE TO_DATE(USER_DATE_10, 'yyyyddd') ENDFROM RKOH_HAPS_AMBS_KD WHERE ACCT = A.ACCT AND ORG = 241 AND BATCH_DATE =TO_CHAR(LAST_DAY(A.PRIOR_BILLING_DATE),'yyyymmdd')) + 0.99999) WHERE TO_CHAR(A.PRIOR_BILLING_DATE,'yyyymm') = :B1;

 

格式化一下:

UPDATE RKO_ACCT_STATUS A

SET RMB_PAYMENT =

(SELECT NVL(SUM(POSTING_AMT),

0)

FROM RKOT_ACCT_PMT_PRIOR B

WHERE B.ACCT = A.ACCT

AND ORG = '242'

AND POSTING_DATE BETWEEN A.PRIOR_BILLING_DATE + 1 AND

ADD_MONTHS(A.PRIOR_BILLING_DATE,

1)

AND TXN_DATE <=

(SELECT CASE

WHEN USER_DATE_10 = 0 THEN

NULL

ELSE

TO_DATE(USER_DATE_10,

'yyyyddd')

END

FROM RKOH_HAPS_AMBS_KD

WHERE ACCT = A.ACCT

AND ORG = 242

AND BATCH_DATE = TO_CHAR(LAST_DAY(A.PRIOR_BILLING_DATE),

'yyyymmdd')) + 0.99999),

USD_PAYMENT =

(SELECT NVL(SUM(POSTING_AMT),

0)

FROM RKOT_ACCT_PMT_PRIOR B

WHERE B.ACCT = A.ACCT

AND ORG = '241'

AND POSTING_DATE BETWEEN A.PRIOR_BILLING_DATE + 1 AND

ADD_MONTHS(A.PRIOR_BILLING_DATE,

1)

AND TXN_DATE <=

(SELECT CASE

WHEN USER_DATE_10 = 0 THEN

NULL

ELSE

TO_DATE(USER_DATE_10,

'yyyyddd')

END

FROM RKOH_HAPS_AMBS_KD

WHERE ACCT = A.ACCT

AND ORG = 241

AND BATCH_DATE = TO_CHAR(LAST_DAY(A.PRIOR_BILLING_DATE),

'yyyymmdd')) + 0.99999)

WHERE TO_CHAR(A.PRIOR_BILLING_DATE,

'yyyymm') = :B1

;

 

 

原sql执行计划:

 

 

------------------------------------- 优化

 

create index ind_RKO_ACCT_date on RKO_ACCT_STATUS(PRIOR_BILLING_DATE) NOLOGGING parallel 20;

alter index ind_RKO_ACCT_date NOPARALLEL;

 

 

 

 

-------------------------------------------------------------------------------------------优化后sql

 

MERGE INTO RKO_ACCT_STATUS t

USING (SELECT /*+USE_HASH(a,b,c)*/ a.rowid rowids,

sum(DECODE(b.org,

242,

NVL(b.POSTING_AMT,

0))) counts,

sum(DECODE(b.org,

241,

NVL(b.POSTING_AMT,

0))) counts1

FROM RKOT_ACCT_PMT_PRIOR B,

RKOH_HAPS_AMBS_KD c,

RKO_ACCT_STATUS a

WHERE B.ACCT = A.ACCT

AND c.ACCT = A.ACCT

AND b.ORG = c.ORG

AND b.ORG IN (242,

241)

AND (b.POSTING_DATE BETWEEN A.PRIOR_BILLING_DATE + 1 AND

ADD_MONTHS(A.PRIOR_BILLING_DATE,

1))

AND (c.BATCH_DATE =

(TO_CHAR(LAST_DAY(A.PRIOR_BILLING_DATE),

'yyyymmdd')) + 0.99999)

AND b.TXN_DATE <= TO_DATE(USER_DATE_10,

'yyyyddd')

AND A.PRIOR_BILLING_DATE BETWEEN

to_date('2014-04-01',

'YYYY-MM-dd') AND

to_date('2014-05-31',

'YYYY-MM-dd')

GROUP BY a.rowid) t1

ON (t.rowid = t1.rowids)

WHEN MATCHED THEN

UPDATE

SET t.RMB_PAYMENT = t1.counts,

t.USD_PAYMENT = t1.counts1

;

    

 


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐