matlab mcc 很慢,一个insert插入语句很慢的优化

记录日期: 2014-07-30 14:25:27

原sql语句:

INSERTINTORISKREPT.BASE_FMLG (BATCH_DATE, DATE_STAMP_ST, TIME_STAMP_ST, ORG, ACCT, CARD_NBR, CARD_SEQ, MER_ORG, MER_NBR, REQUEST_TYPE_ID, LOGO, SYSTEM_ACTION, FINAL_ACTION, ACTION_REASON, REVERSAL_REASON, AVAIL_CR, CASH_AVAIL_CR, ACCT_CURR_BAL, ACCT_CURR_BAL_CASH, B007_GMT_DATE_TIME, B018_MER_TYPE, B019_CNTRY_CODE, B032_ACQ_ID, B033_FWD_ID, AUTH_CODE, B039_RESP_CODE, B041_CRD_ACCPT_TERM, B042_TERMTYPE2_MER_ID, B043_CRD_ACCPT_NAM, B043_CRD_ACCPT_CITY, B043_CRD_ACCPT_ST_CTRY, MESSAGE_TYPE_ID, RECORD_TYPE, SALES_AMT_RMB, TOTAL_SALES_AMT, B049_CURR_CODE, BLING_AMT, POS_ENTRY_MODE, PIN_ENTRY_MODE, TRADE_INTERNET, SALES_CTRY, SALES_CTRY_NAME, SALES_CITY, SALES_CITY_NAME, SALES_LINK, MER_CODE, MER_MCC, MER_NAM, ACQ_NAME, REVCODE, AUTH_TYPE, REF_NBR, VI_B011_SYS_AUDT_TRCE, CARD_TYPE, STAGE_TYPE, STAGE_NUM, OVERSEA_FLAG, RISK_FCD, RISK_LCD) SELECTBATCH_DATE, DATE_STAMP_ST, TIME_STAMP_ST, ORG, ACCT, CARD_NBR, CARD_SEQ, MER_ORG, MER_NBR, REQUEST_TYPE_ID, LOGO, SYSTEM_ACTION, FINAL_ACTION, ACTION_REASON, REVERSAL_REASON, AVAIL_CR, CASH_AVAIL_CR, ACCT_CURR_BAL, ACCT_CURR_BAL_CASH, B007_GMT_DATE_TIME, B018_MER_TYPE, B019_CNTRY_CODE, B032_ACQ_ID, B033_FWD_ID, AUTH_CODE, B039_RESP_CODE, B041_CRD_ACCPT_TERM, B042_TERMTYPE2_MER_ID, B043_CRD_ACCPT_NAM, B043_CRD_ACCPT_CITY, B043_CRD_ACCPT_ST_CTRY, MESSAGE_TYPE_ID, RECORD_TYPE, SALES_AMT_RMB, TOTAL_SALES_AMT, B049_CURR_CODE, BLING_AMT, POS_ENTRY_MODE, PIN_ENTRY_MODE, TRADE_INTERNET, SALES_CTRY, SALES_CTRY_NAME, SALES_CITY, SALES_CITY_NAME, SALES_LINK, MER_CODE, MER_MCC, MER_NAM, ACQ_NAME, REVCODE, AUTH_TYPE, REF_NBR, VI_B011_SYS_AUDT_TRCE, CARD_TYPE, STAGE_TYPE, STAGE_NUM, OVERSEA_FLAG, SYSDATE, SYSDATEFROMTEMP_FMLG_PURGE

原sql执行计划非常简单:

5062bad6710db3aad0d891a120801bd4.png

该语句是job中的语句,每天都需要跑的,其历史执行时间如下图,可以看出执行时间非常长的都是user_io_wait等待比较严重的一些:

fe4d3d67665733898934174ab15ee267.png

查看一下相关表的属性和数据量:

SELECTv.OWNER,

v.TABLE_NAME,

v.partitioned,

v.LAST_ANALYZED,

v.NUM_ROWS,

v.table_size2 ,

v.EMPTY_BLOCKS

FROMvw_table_lhr v

WHEREv.TABLE_NAME IN('BASE_FMLG',

'TEMP_FMLG_PURGE');

5cbcb2f87d28be4a18136d1c9fb0fb8f.png

BASE_FMLG有15亿的数据量,是个分区表,每次从TEMP_FMLG_PURGE中取数,TEMP_FMLG_PURGE大约有234W的数据量,

索引信息:

SELECTv.index_owner,

v.index_name,

v.index_type,

v.partitioned,

v.索引列,

v.index_size,

v.num_rows

FROMvw_table_index_lhr v

WHEREv.TABLE_NAME IN('BASE_FMLG',

'TEMP_FMLG_PURGE');

ae085685e432e93d9bbca6dea3d02a5e.png

被插入的表有5个索引,且都是分区索引,不涉及全局索引,涉及到的分区索引:

selectv.index_owner,

v.index_name,

v.index_type,

v.索引列,

v.partition_size,

v.num_rows

fromvw_table_index_part2_lhr V

whereV.TABLE_NAME='BASE_FMLG'

andv.PARTITION_NAME='P201407';

146c6845bf095e9a3525375fdb8654bc.png

查一下数据来源:

SELECTt.BATCH_DATE,

COUNT(1)

FROMTEMP_FMLG_PURGE t

GROUPBYt.BATCH_DATE;

037529a4caa3fae10e66f8bcfed4cd70.png

看来,都是当天的数据,所以只涉及到分区表的单个分区

selectv.PARTITION_NAME,

v.TABLE_NAME,

v.LAST_ANALYZED,

v.NUM_ROWS,

v.partition_size ,

v.EMPTY_BLOCKS,v.LOGGING

fromVW_TABLE_PART_LHR V

whereV.TABLE_NAME='BASE_FMLG';

23fa27cb51d18b51fa6c214a436fb3e8.png

系统预估剩余时间:select* fromVW_LONGRUN_LHR a wherea.SQL_ID='2pnas8zbxtk3a';

a86f18bfa1607c62e6bc648e7951841b.png

插入200W的数据到一个单个分区16G的分区表中需要花费将近12个小时,似乎慢了点。。。。。

问题解决:

查询会话的统计信息,发现redo的产生量非常的大,所以解决办法:

第一步: 将表修改为nologging属性

第二步: 将索引修改为nologging属性

第三步: 插入的时候采用append方式来插入

第四步:如果还是慢点的话,可以采用并行插入,增大排序缓冲区

第五步:如果有可能可以先把索引置于无效状态,然后插入完成之后再重建索引

注意: 以上解决办法①必须是该表的数据不重要,不然修改为nologging属性后万一数据丢失可能就找不回来了,② 索引一般都为nologging模式,索引记录redo没有作用 ③ 采用append插入的前提是该表上边没有大量的delete动作

最后优化后的代码:

先将表及其索引置于NOLOGGING模式:

altertableRISKREPT.BASE_FMLG NOLOGGING;

alterindexDX_RKO_FMLG_BATCH_DATE NOLOGGING;

alterindexIDX_RKO_FMLG_ACCT NOLOGGING;

alterindexIDX_RKO_FMLG_CARD NOLOGGING;

alterindexIDX_RKO_FMLG_DT NOLOGGING;

alterindexIDX_RKO_FMLG_MER NOLOGGING;

----- 修改会话的属性,开启并行插入:

altersessionsetworkarea_size_policy=manual;

altersessionsetsort_area_size=1000000000;

altersessionENABLEparalleldml;

EXPLAINPLANfor

INSERT/*+parallel(BASE_FMLG,4) */INTORISKREPT.BASE_FMLG (BATCH_DATE, DATE_STAMP_ST, TIME_STAMP_ST, ORG, ACCT, CARD_NBR, CARD_SEQ, MER_ORG, MER_NBR, REQUEST_TYPE_ID, LOGO, SYSTEM_ACTION, FINAL_ACTION, ACTION_REASON, REVERSAL_REASON, AVAIL_CR, CASH_AVAIL_CR, ACCT_CURR_BAL, ACCT_CURR_BAL_CASH, B007_GMT_DATE_TIME, B018_MER_TYPE, B019_CNTRY_CODE, B032_ACQ_ID, B033_FWD_ID, AUTH_CODE, B039_RESP_CODE, B041_CRD_ACCPT_TERM, B042_TERMTYPE2_MER_ID, B043_CRD_ACCPT_NAM, B043_CRD_ACCPT_CITY, B043_CRD_ACCPT_ST_CTRY, MESSAGE_TYPE_ID, RECORD_TYPE, SALES_AMT_RMB, TOTAL_SALES_AMT, B049_CURR_CODE, BLING_AMT, POS_ENTRY_MODE, PIN_ENTRY_MODE, TRADE_INTERNET, SALES_CTRY, SALES_CTRY_NAME, SALES_CITY, SALES_CITY_NAME, SALES_LINK, MER_CODE, MER_MCC, MER_NAM, ACQ_NAME, REVCODE, AUTH_TYPE, REF_NBR, VI_B011_SYS_AUDT_TRCE, CARD_TYPE, STAGE_TYPE, STAGE_NUM, OVERSEA_FLAG, RISK_FCD, RISK_LCD) SELECTBATCH_DATE, DATE_STAMP_ST, TIME_STAMP_ST, ORG, ACCT, CARD_NBR, CARD_SEQ, MER_ORG, MER_NBR, REQUEST_TYPE_ID, LOGO, SYSTEM_ACTION, FINAL_ACTION, ACTION_REASON, REVERSAL_REASON, AVAIL_CR, CASH_AVAIL_CR, ACCT_CURR_BAL, ACCT_CURR_BAL_CASH, B007_GMT_DATE_TIME, B018_MER_TYPE, B019_CNTRY_CODE, B032_ACQ_ID, B033_FWD_ID, AUTH_CODE, B039_RESP_CODE, B041_CRD_ACCPT_TERM, B042_TERMTYPE2_MER_ID, B043_CRD_ACCPT_NAM, B043_CRD_ACCPT_CITY, B043_CRD_ACCPT_ST_CTRY, MESSAGE_TYPE_ID, RECORD_TYPE, SALES_AMT_RMB, TOTAL_SALES_AMT, B049_CURR_CODE, BLING_AMT, POS_ENTRY_MODE, PIN_ENTRY_MODE, TRADE_INTERNET, SALES_CTRY, SALES_CTRY_NAME, SALES_CITY, SALES_CITY_NAME, SALES_LINK, MER_CODE, MER_MCC, MER_NAM, ACQ_NAME, REVCODE, AUTH_TYPE, REF_NBR, VI_B011_SYS_AUDT_TRCE, CARD_TYPE, STAGE_TYPE, STAGE_NUM, OVERSEA_FLAG, SYSDATE, SYSDATEFROMTEMP_FMLG_PURGE_2 ;

commit;

select* fromtable(DBMS_XPLAN.display('','',''));

优化后的执行计划:

c864477ced6eb3bebfdf10445d6cd1ba.png

自己跑了一下,大约30分钟就可以跑完,从12个小时缩短到30分钟,这个还是比较有成就感的。。。。

产生的redo量不足500M,未优化之前的那个redo量达到了15G左右,忘记截图了,所以这个sql就优化的差不多了:

select* fromVW_SESSTAT_LHR a wherea.SID=850orderbya.VALUE desc;

2e6fa816959c9743e7ecf4dad91b40c0.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值