update修改为merge(max+decode)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了update修改为merge(max+decode),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3027字,纯文字阅读大概需要5分钟。
内容图文
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
;
内容总结
以上是互联网集市为您收集整理的update修改为merge(max+decode)全部内容,希望文章能够帮你解决update修改为merge(max+decode)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。