SQL:sql
MERGE INTO TP_B_RB033 TP USING (SELECT SEQ_NO, PAGE_NUM, FULL_PAGE, ACCT_NO FROM TP_B_RB033_RB_TMP) RES ON (TP.SEQ_NO = RES.SEQ_NO AND RES.ACCT_NO = TP.ACCT_NO) WHEN MATCHED THEN UPDATE SET TP.PAGE_NUM = RES.PAGE_NUM, TP.FULL_PAGE = RES.FULL_PAGE WHERE SUBSTR(REPORT_DATE, 1, 6) = SUBSTR(:B1, 1, 6)
执行计划:测试
执行计划口诀:先从最开头 一直向右看,直到看到最右边并列的地方,对于并列的地方,从上到下看,靠上的先执行;对于不并列,靠右的先执行;优化
从执行计划能够看到 执行顺序是 4 6 5 3 2 1,驱动表是 *tmp,走的全表扫描,表链接走的是hash 链接。spa
据业务人员介绍,天天采集交易数据灌注到*tmp表,而后执行这个sql语句同步数据,完成以后再清理掉*Tmp数据,*tmp表数据不是很大,最大的时候也就2万。code
因此这个场景使用NL是最好的了,驱动表走索引,被驱动表也要建立索引,blog
若是有环境 能够 测试一下select 和update看看是哪一个慢,这样优化更有针对性。索引
update 语句的where 条件 ‘WHERE SUBSTR(REPORT_DATE, 1, 6) = SUBSTR(:B1, 1, 6)’须要注意下,对于相似 where id like '%id'是不走索引的,能够改为 ‘WHERE REPORT_DATE like SUBSTR(:B1, 1, 6)||%’ 同步
总结:hash
一、*tmp 做为驱动表,要建立索引,date
二、被驱动表 TP_B_RB033数据量比较大, 也要建立索引,
三、优化update ,,,,,,,,where SUBSTR(REPORT_DATE, 1, 6) = SUBSTR(:B1, 1, 6) 为‘update ,,,,,,, WHERE REPORT_DATE like SUBSTR(:B1, 1, 6)||%’