暂无图片
merge into的性能问题
我来答
分享
张明轩
2022-06-29
merge into的性能问题
暂无图片 100M

语句如下:

MERGE INTO table A USING ( SELECT INNER_NO, BILL_FORMAT,
SA_ACCT_NO, SA_OPEN_BRANCH, ACCT_NAME, SA_TX_DT, SA_TX_BRANCH,
SA_OPR_NO, CURR_CODE, CURR_NAME, SA_TX_LOG_NO, SA_TX_CODE, DC_FLAG,
SA_TX_AMT, SA_USAGE, DOC_TYP_CODE, DOC_TYP, DOC_NO, SA_JSFS,
CHANNEL_NO, SA_TX_TYPE, SA_OP_ACCT_NO, SA_OP_CUST_NAME, APPEND_FIELDS,
QRCODE_STRING, IS_PATCH, PRINT_CNTS, NEED_RECORD, RECORD_FINISH,
RECORD_TIME, RECORD_BRANCH, RECORD_OPER, RECORD_FORMAT, FCM_ROWID,
LOG_TIME, AUTHORIZER, RECORD_ATTBRH, RED_FLAG, NEED_HIDE, TX_LOG_NO
FROM table_TMP WHERE TX_LOG_NO IS NOT NULL AND SA_ACCT_NO
IS NOT NULL AND SA_JSFS IS NOT NULL ) B ON (A.SA_TX_DT=B.SA_TX_DT AND
A.TX_LOG_NO=B.TX_LOG_NO ) WHEN MATCHED THEN UPDATE SET
A.INNER_NO=B.INNER_NO,A.BILL_FORMAT=B.BILL_FORMAT,A.SA_ACCT_NO=B.SA_ACCT
_NO, A.SA_OPEN_BRANCH=B.SA_OPEN_BRANCH,A.ACCT_NAME=B.ACCT_NAME,
A.SA_TX_BRANCH=B.SA_TX_BRANCH,A.SA_OPR_NO=B.SA_OPR_NO,
A.CURR_CODE=B.CURR_CODE,A.CURR_NAME=B.CURR_NAME,
A.SA_TX_LOG_NO=B.SA_TX_LOG_NO,A.SA_TX_CODE=B.SA_TX_CODE,
A.DC_FLAG=B.DC_FLAG,A.SA_TX_AMT=B.SA_TX_AMT,A.SA_USAGE=B.SA_USAGE,
A.DOC_TYP_CODE =B.DOC_TYP_CODE ,A.DOC_TYP=B.DOC_TYP,A.DOC_NO=B.DOC_NO,
A.SA_JSFS=B.SA_JSFS,A.CHANNEL_NO=B.CHANNEL_NO,A.SA_TX_TYPE=B.SA_TX_TYPE,
 A.SA_OP_ACCT_NO=B.SA_OP_ACCT_NO,A.SA_OP_CUST_NAME=B.SA_OP_CUST_NAME,
A.APPEND_FIELDS=B.APPEND_FIELDS,A.QRCODE_STRING=B.INNER_NO,
A.IS_PATCH=B.IS_PATCH,A.PRINT_CNTS=B.PRINT_CNTS,A.NEED_RECORD=B.NEED_REC
ORD, A.RECORD_FINISH=B.RECORD_FINISH,A.RECORD_ATTBRH=B.RECORD_ATTBRH,
A.RED_FLAG=B.RED_FLAG,A.NEED_HIDE=B.NEED_HIDE WHEN NOT MATCHED THEN
INSERT VALUES ( B.INNER_NO, B.BILL_FORMAT, B.SA_ACCT_NO,
B.SA_OPEN_BRANCH,B.ACCT_NAME, B.SA_TX_DT,
B.SA_TX_BRANCH,B.SA_OPR_NO,B.CURR_CODE,B.CURR_NAME, B.SA_TX_LOG_NO,
B.SA_TX_CODE, B.DC_FLAG,B.SA_TX_AMT,B.SA_USAGE, B.DOC_TYP_CODE,
B.DOC_TYP, B.DOC_NO, B.SA_JSFS, B.CHANNEL_NO, B.SA_TX_TYPE,
B.SA_OP_ACCT_NO, B.SA_OP_CUST_NAME, B.APPEND_FIELDS, B.INNER_NO,
B.IS_PATCH, B.PRINT_CNTS, B.NEED_RECORD, B.RECORD_FINISH,
B.RECORD_TIME, B.RECORD_BRANCH, B.RECORD_OPER, B.RECORD_FORMAT,
B.FCM_ROWID, B.LOG_TIME, B.AUTHORIZER, B.RECORD_ATTBRH, B.RED_FLAG,
B.NEED_HIDE, B.TX_LOG_NO )
复制

执行计划如下:

Plan hash value: 1753905604

-------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                             | Name                  | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
-------------------------------------------------------------------------------------------------------------------------------
|   0 | MERGE STATEMENT                       |                       |       |       |   784K(100)|          |       |       |
|   1 |  MERGE                                | table                 |       |       |            |          |       |       |
|   2 |   VIEW                                |                       |       |       |            |          |       |       |
|   3 |    NESTED LOOPS OUTER                 |                       |   258K|   434M|   784K  (1)| 02:36:52 |       |       |
|   4 |     TABLE ACCESS FULL                 | table_TMP             |   258K|   218M|  8550   (1)| 00:01:43 |       |       |
|   5 |     TABLE ACCESS BY GLOBAL INDEX ROWID| table                 |     1 |   875 |     3   (0)| 00:00:01 | ROWID | ROWID |
|   6 |      INDEX RANGE SCAN                 | SYS_C0013050          |     1 |       |     3   (0)| 00:00:01 |       |       |
-------------------------------------------------------------------------------------------------------------------------------


51 rows selected.
复制

NESTED LOOPS OUTER部分是否可以优化? 

我来答
添加附件
收藏
分享
问题补充
4条回答
默认
最新
Uncopyrightable

单表查询是不是就行了


暂无图片 评论
暂无图片 有用 0
打赏 0
张明轩
题主
2022-06-29
不太懂您的意思
吾喾

table_TMP加8或者16并行?

暂无图片 评论
暂无图片 有用 0
打赏 0
赵勇

加个提示/*+ use_hash(a) */,然后explain plan for 看看执行计划是什么?

explain plan for
MERGE /*+ use_hash(a) */ INTO table A USING ( SELECT INNER_NO, BILL_FORMAT,
.......

select * from table(dbms_xplan.display);

复制
暂无图片 评论
暂无图片 有用 0
打赏 0

将三个is not null替换成函数有效么?nvl(TX_LOG_NO,0)<> 0 and  nvl(SA_ACCT_NO,0)<> 0 and nvl(SA_JSFS,0)<> 0

暂无图片 评论
暂无图片 有用 0
打赏 0
回答交流
Markdown


请输入正文
提交
相关推荐
Oracle 11g 补丁升级是否考虑对12c 的兼容性问题
回答 2
不需要考虑,因为互不影响
OACLE EBS 是什么架构?BS?CS?
回答 5
已采纳
EBS有db层和应用层,db层用的自家的Oracle数据库,应用层会有一系列中间件,提供对外服务,用户通过浏览器登录EBS系统。所以算是BS架构吧
oracle体系结构,进程问题
回答 3
有可能是LOCALyes的
SEG$逻辑读很高,有遇到过的吗
回答 2
这个问题,可以通过ash、awr去找出相关SQL,分析其是否正常。
如果文件系统损坏了,Oracle数据库是如何正常运行的?是不是造成临时表空间无法扩展的原因?
回答 1
如果像你说的损坏了,那么只能说你现在数据都在内存中。你重启数据库可能起不来了。临时表空间无法扩展,也有可能,看具体报错了。是空间不足,还是文件达到了最大。还是无法识别等等。
什么是Oracle的复合类型的变量?
回答 2
已采纳
既然谈到变量,那我们限定场景是PLSQL吧。应该是associativearray,nestedtable和varray三种类型吧,这三种也叫collectiontype,Oracle专家eSteve
ORACLE 12C RAC安装完成后,查看CRS状态,发现多了一个ASM节点3;重新安装问题依旧存在,请帮忙处理。
回答 2
正常安装的话室没问题的
在impdp导入oracle12c数据库时出现大量约束显示创建失败,对象类型约束已存在这样的错误如何才能正常创建?
回答 2
已采纳
这个是由于impdp的时候,索引和约束的创建先后顺序问题导致的,以前遇到过这个问题。1.首先,需要找到这些报错的相关对象,在导入的时候,需要把这些表和索引以及约束排除掉(以下用3个表来举例)exclu
Oracle drop tablespaces 删除表空间的恢复:只是在 oracle 里执行了删除,但物理文件还在, 有办法恢复吗?
回答 1
已采纳
有,linux下通过句柄恢复。网上可以查下方法。
oracle备份整个数据库,backup database,测试删除一个表,恢复不了?
回答 3
根据backupdatabase的备份可以先恢复到一个测试库,然后从测试库导出这张表,在将其导入到生产环境。或者问清楚怎么删除的,droptableXX的话,一般回收站是开启的,可以从回收站捞出来;d