查看: 2136|回复: 0

存储优化大家帮忙看看!

[复制链接]
认证徽章
论坛徽章:
58
生肖徽章2007版:马
日期:2009-11-06 23:12:33授权会员
日期:2013-01-10 14:38:592013年新春福章
日期:2013-02-25 14:51:24马自达
日期:2013-08-07 10:54:45红旗
日期:2013-08-09 13:48:48劳斯莱斯
日期:2013-09-12 15:56:37萤石
日期:2013-10-31 08:44:19优秀写手
日期:2013-12-18 09:29:13Jeep
日期:2014-01-14 10:53:432014年新春福章
日期:2014-02-18 16:43:09
发表于 2010-11-30 14:45 | 显示全部楼层 |阅读模式
下面的存储过程用来加载数据的
常常涉及大表,
反应加载很慢
很不习惯这种写法,但是让我调优,我不知道如何修正这些脚本,请大家帮忙出出主意



CREATE OR REPLACE PROCEDURE xxxxx.HIST_OFR_MAIN_ASSET(P_DATE_CD IN VARCHAR2,

                                                V_LOCAL  IN VARCHAR2,
                                                P_NUMBER OUT NUMBER) IS

  --V_MAIN STA_OFR_MAIN_ASSET_N_D_E%ROWTYPE;
  --V_COUNT NUMBER(20) := 0;
  L_COUNT NUMBER(3) := 0;
  /* CURSOR C_MAIN IS
  SELECT * FROM STA_OFR_MAIN_ASSET_N_D_E;*/
BEGIN
  P_NUMBER := 0;
  --1)当天重复加载数据还原
  DELETE FROM OFR_MAIN_ASSET_N_HIST_E WHERE START_DT = P_DATE_CD;

  UPDATE OFR_MAIN_ASSET_N_HIST_E
     SET END_DT = '30001231'
   WHERE END_DT = P_DATE_CD;

  UPDATE OFR_MAIN_ASSET_N_HIST_E A
     SET A.END_DT = P_DATE_CD
   WHERE exists
         (SELECT 1 FROM STA_OFR_MAIN_ASSET_N_D_E
         where trim(asset_row_id) = A.ASSET_ROW_ID)
     AND A.END_DT = '30001231';
  --2)索引制失效
  SELECT COUNT(1)
    INTO L_COUNT
    FROM USER_INDEXES
   WHERE TABLE_NAME = 'OFR_MAIN_ASSET_N_HIST_E'
     AND TABLE_OWNER = 'xxxxx';
  IF L_COUNT > 0 THEN
    SP_INDEX_DISABLE('OFR_MAIN_ASSET_N_HIST_E');
  END IF;
  
  INSERT /*+ APPEND*/
  INTO OFR_MAIN_ASSET_N_HIST_E
    (ASSET_ROW_ID,
     START_DT,
     END_DT,
     STD_PRD_LVL4_NAME,
     STD_USER_TYPE_LVL2_NAME,
     CPRD_NAME,
     STAT_NAME,
     EXCH_NAME,
     AREA_NAME,
     AREA_MERGE_NAME,
     AREA_TYPE_NAME,
     SERV_TYPE_NAME,
     TELECOM_AREA_NAME,
     ACCS_NBR,
     CIRC_NBR,
     DATA_USER_NAME,
     CENTREX_GRP_ID,
     VPN_GRP_ID,
     VPN_INNER_ID,
     WAC_GRP_ID,
     CITY_TYPE_NAME,
     USER_NAME,
     LINKMAN_NAME,
     LINK_PHONE_NBR,
     ADDR_BUNCH_NAME,
     ADDR_NAME,
     STD_PRD_LVL4_ID,
     STD_USER_TYPE_LVL2_CD,
     CPRD_ID,
     EXCH_ID,
     AREA_ID,
     TELECOM_AREA_ID,
     ASSET_INTEG_ID,
     CCUST_ID,
     CACCT_ID,
     CCUST_ROW_ID,
     CACCT_ROW_ID,
     CACCT_OWE_STAT_NAME,
     MKT_CHANNEL_NAME,
     MKT_CHANNEL_SUB_NAME,
     MKT_CHANNEL_LVL2_NAME,
     INITIATIVE_SUSPEND_FLG,
     PECCANCY_SUSPEND_FLG,
     LOSS_SUSPEND_FLG,
     OWE_SUSPEND_NAME,
     SERV_START_DT,
     SERV_END_DT,
     FREE_FLG,
     CORP_PAY_FLG,
     TEST_FLG,
     NO_SUSPEND_FLG,
     NO_REMIND_FLG,
     NO_CALL_FLG,
     ZWXNW_TYPE_NAME,
     ON_SERV_FLG,
     PAY_SUB_STATION,
     DISCON_REASON,
     USER_GRADE,
     PRE_ACTIVE_STATUS,
     PAY_METH_NAME,
     FJ_AREA_ID,
     FJ_AREA_NAME,
     ZJ_AREA_ID,
     ZJ_AREA_NAME,
     LAST_DISPLAY_AREA_ID,
     LAST_DISPLAY_AREA_NAME,
     PCUST_ROW_ID,
     ASSET_ID,
     DEPEND_CIRC_NBR,
     LINE_NBR,
     BR_EXCH_ID,
     DEPT_ROW_ID,
     DEPT_NAME,
     AGENT_ID,
     PROM_ASSET_INTEG_ID,
     RELATED_ASSET_INTEG_ID,
     XNW_TYPE_NAME,
     ONEWAY_STOP_DT,
     TWOWAY_STOP_DT,
     COMB_STAT_NAME,
     CORP_USER_NAME,
     SALES_ORG_LVL3_CD,
     LOCATION_ATTR,
     INDUS_LVL3_ID,
     CCUST_STAT_NAME,
     PAY_MODE_CD,
     CCUST_CD,
     CACCT_CDMA_CNT,
     CACCT_FIX_LINE_CNT,
     CACCT_PHS_CNT,
     CACCT_BRD_CNT,
     CLUSTER_ROW_ID,
     CLUSTER_NAME,
     CLUSTER_TYPE_ID,
     CLUSTER_TYPE_NAME,
     CLUSTER_MANAGER_ID,
     CLUSTER_MANAGER_NAME,
     MANAGER_ID,
     MANAGER_NAME,
     MANAGER_REL_NBR,
     VIP_MANAGER_ID,
     VIP_MANAGER_NAME,
     VIP_MANAGER_REL_NBR,
     BIL_FLG,
     ON_NET_FLG,
     SPEED,
     CENTREX_INNER_ID,
     LAST_UPD_TIME,
     LATN_ID,
     CCP_ID,
     GCCP_ID,
     CCP_NAME,
     CCP_ADDR,
     CCP_TYPE_NAME,
     PARENT_CCP_ID,
     CABINET_CCP_ID,
     CABINET_GCCP_ID,
     CABINET_CCP_NAME,
     CABINET_CCP_ADDR,
     CABINET_CCP_TYPE_NAME)
    select trim(ASSET_ROW_ID),
           trim(START_DT),
           trim(END_DT),
           trim(STD_PRD_LVL4_NAME),
           trim(STD_USER_TYPE_LVL2_NAME),
           trim(CPRD_NAME),
           trim(STAT_NAME),
           trim(EXCH_NAME),
           trim(AREA_NAME),
           trim(AREA_MERGE_NAME),
           trim(AREA_TYPE_NAME),
           trim(SERV_TYPE_NAME),
           trim(TELECOM_AREA_NAME),
           trim(ACCS_NBR),
           trim(CIRC_NBR),
           trim(DATA_USER_NAME),
           trim(CENTREX_GRP_ID),
           trim(VPN_GRP_ID),
           trim(VPN_INNER_ID),
           trim(WAC_GRP_ID),
           trim(CITY_TYPE_NAME),
           trim(USER_NAME),
           trim(LINKMAN_NAME),
           trim(LINK_PHONE_NBR),
           trim(ADDR_BUNCH_NAME),
           trim(ADDR_NAME),
           trim(STD_PRD_LVL4_ID),
           trim(STD_USER_TYPE_LVL2_CD),
           trim(CPRD_ID),
           trim(EXCH_ID),
           trim(AREA_ID),
           trim(TELECOM_AREA_ID),
           trim(ASSET_INTEG_ID),
           trim(CCUST_ID),
           trim(CACCT_ID),
           trim(CCUST_ROW_ID),
           trim(CACCT_ROW_ID),
           trim(CACCT_OWE_STAT_NAME),
           trim(MKT_CHANNEL_NAME),
           trim(MKT_CHANNEL_SUB_NAME),
           trim(MKT_CHANNEL_LVL2_NAME),
           trim(INITIATIVE_SUSPEND_FLG),
           trim(PECCANCY_SUSPEND_FLG),
           trim(LOSS_SUSPEND_FLG),
           trim(OWE_SUSPEND_NAME),
           trim(SERV_START_DT),
           trim(SERV_END_DT),
           trim(FREE_FLG),
           trim(CORP_PAY_FLG),
           trim(TEST_FLG),
           trim(NO_SUSPEND_FLG),
           trim(NO_REMIND_FLG),
           trim(NO_CALL_FLG),
           trim(ZWXNW_TYPE_NAME),
           trim(ON_SERV_FLG),
           trim(PAY_SUB_STATION),
           trim(DISCON_REASON),
           trim(USER_GRADE),
           trim(PRE_ACTIVE_STATUS),
           trim(PAY_METH_NAME),
           trim(FJ_AREA_ID),
           trim(FJ_AREA_NAME),
           trim(ZJ_AREA_ID),
           trim(ZJ_AREA_NAME),
           trim(LAST_DISPLAY_AREA_ID),
           trim(LAST_DISPLAY_AREA_NAME),
           trim(PCUST_ROW_ID),
           trim(ASSET_ID),
           trim(DEPEND_CIRC_NBR),
           trim(LINE_NBR),
           trim(BR_EXCH_ID),
           trim(DEPT_ROW_ID),
           trim(DEPT_NAME),
           trim(AGENT_ID),
           trim(PROM_ASSET_INTEG_ID),
           trim(RELATED_ASSET_INTEG_ID),
           trim(XNW_TYPE_NAME),
           trim(ONEWAY_STOP_DT),
           trim(TWOWAY_STOP_DT),
           trim(COMB_STAT_NAME),
           trim(CORP_USER_NAME),
           trim(SALES_ORG_LVL3_CD),
           trim(LOCATION_ATTR),
           trim(INDUS_LVL3_ID),
           trim(CCUST_STAT_NAME),
           trim(PAY_MODE_CD),
           trim(CCUST_CD),
           trim(CACCT_CDMA_CNT),
           trim(CACCT_FIX_LINE_CNT),
           trim(CACCT_PHS_CNT),
           trim(CACCT_BRD_CNT),
           trim(CLUSTER_ROW_ID),
           trim(CLUSTER_NAME),
           trim(CLUSTER_TYPE_ID),
           trim(CLUSTER_TYPE_NAME),
           trim(CLUSTER_MANAGER_ID),
           trim(CLUSTER_MANAGER_NAME),
           trim(MANAGER_ID),
           trim(MANAGER_NAME),
           trim(MANAGER_REL_NBR),
           trim(VIP_MANAGER_ID),
           trim(VIP_MANAGER_NAME),
           trim(VIP_MANAGER_REL_NBR),
           trim(BIL_FLG),
           trim(ON_NET_FLG),
           trim(SPEED),
           trim(CENTREX_INNER_ID),
           LAST_UPD_TIME,
           trim(LATN_ID),
           trim(CCP_ID),
           trim(GCCP_ID),
           trim(CCP_NAME),
           trim(CCP_ADDR),
           trim(CCP_TYPE_NAME),
           trim(PARENT_CCP_ID),
           trim(CABINET_CCP_ID),
           trim(CABINET_GCCP_ID),
           trim(CABINET_CCP_NAME),
           trim(CABINET_CCP_ADDR),
           trim(CABINET_CCP_TYPE_NAME)
      from sta_ofr_main_asset_n_d_e;

  commit;
  --4)索引重建
  SP_INDEX_REBUID('OFR_MAIN_ASSET_N_HIST_E');
exception
  WHEN OTHERS THEN
    ROLLBACK;
    P_NUMBER := SQLCODE;
    DBMS_OUTPUT.PUT_LINE(SQLERRM);
END HIST_OFR_MAIN_ASSET;



CREATE OR REPLACE PROCEDURE xxxxxx.T_CHANGE_FIN_ITEM_BIL_REV_DAY(V_DATE_CD IN VARCHAR2,

                                                        V_LOCAL   IN VARCHAR2,
                                                        P_NUMBER  OUT NUMBER) IS
  V_TABLE_NAME  VARCHAR2(50);
  V_ST_TAB_NAME VARCHAR2(50);
  L_COUNT       NUMBER(3) := 0;
  V_COUNT       NUMBER(20) := 0;
  V_SQL         VARCHAR2(4000);
  V_SQL_VALUE   VARCHAR2(4000);
  V_SQL1        VARCHAR2(100);
  V_SQL_TRIM    VARCHAR2(4000);
  V_BIL         STA_FIN_ITEM_BIL_REV_D_E%ROWTYPE;
  TYPE REF_CURSOR IS REF CURSOR;
  C_BIL REF_CURSOR;

BEGIN
  P_NUMBER := 0;
  --1)拼接目标表和中间表
  V_TABLE_NAME  := 'FIN_ITEM_BIL_REV_DAY_' || V_LOCAL;
  V_ST_TAB_NAME := 'STA_FIN_ITEM_BIL_REV_D_' || V_LOCAL;
  --2)删除当前天数据
  EXECUTE IMMEDIATE 'DELETE FROM ' || V_TABLE_NAME || ' WHERE DATE_CD = ''' ||
                    V_DATE_CD||'''';
  COMMIT;
  --3)索引制失效
  SELECT COUNT(1)
    INTO L_COUNT
    FROM USER_INDEXES
   WHERE TABLE_NAME = V_TABLE_NAME
     AND TABLE_OWNER = 'xxxxx';
  IF L_COUNT > 0 THEN
    SP_INDEX_DISABLE(V_TABLE_NAME);
  END IF;
  --4)取目标表字段
  T_SP_GET_TAB_COMUMN(V_TABLE_NAME, V_SQL,V_SQL_TRIM, V_SQL_VALUE);
  --5)插入目标表
  V_SQL1 := 'SELECT * FROM ' || V_ST_TAB_NAME;
  OPEN C_BIL FOR V_SQL1;
  LOOP
    FETCH C_BIL
      INTO V_BIL;
    EXIT WHEN C_BIL%NOTFOUND;
    EXECUTE IMMEDIATE 'INSERT INTO ' || V_TABLE_NAME || '(' || V_SQL ||
                      ') VALUES(' || V_SQL_VALUE || ')'
      USING
      trim(V_BIL.ASSET_ROW_ID),
      trim(V_DATE_CD),
      trim(V_BIL.STD_PRD_LVL4_ID),
      trim(V_BIL.STD_PRD_LVL4_NAME),
      trim(V_BIL.CPRD_ID),
      trim(V_BIL.CPRD_NAME),
      trim(V_BIL.CACCT_ID),
      trim(V_BIL.CCUST_ID),
      trim(V_BIL.CCUST_ROW_ID),
      trim(V_BIL.CACCT_ROW_ID),
      trim(V_BIL.ASSET_INTEG_ID),
      trim(V_BIL.ACCS_NBR),
      trim(V_BIL.STD_CHARGE_ITEM_LVL4_CD),
      trim(V_BIL.USER_TYPE_CD),
      trim(V_BIL.AMT),
      trim(V_BIL.SUM_ORIG_AMT),
      trim(V_BIL.SUM_DSC_AMT),
      trim(V_BIL.SUM_FREE_AMT),
      trim(V_BIL.SUM_ADJ_AMT),
      trim(V_BIL.SUM_RFS_AMT),
      trim(V_BIL.SUM_AMT),
      trim(V_BIL.CREATE_DT),
      trim(V_BIL.LATN_ID);
    V_COUNT := V_COUNT + 1;
    IF MOD(V_COUNT, 2000) = 0 THEN
      COMMIT;
    END IF;
  END LOOP;
  COMMIT;
  CLOSE C_BIL;
  --6)索引重建
  SP_INDEX_REBUID(V_TABLE_NAME);
EXCEPTION
  WHEN OTHERS THEN
    ROLLBACK;
    P_NUMBER := SQLCODE;
    DBMS_OUTPUT.PUT_LINE(SQLERRM);
END T_CHANGE_FIN_ITEM_BIL_REV_DAY;



CREATE OR REPLACE PROCEDURE xxxxx.T_CHANGE_NET_CDR_DAY_DS(V_DATE_CD IN VARCHAR2,

                                                  V_LOCAL   IN VARCHAR2,
                                                  P_NUMBER  OUT NUMBER) IS
  V_TABLE_NAME  VARCHAR2(50);
  V_ST_TAB_NAME VARCHAR2(50);
  L_COUNT       NUMBER(5) := 0;
  V_SQL         VARCHAR2(4000);
  V_SQL_VALUE   VARCHAR2(4000);
  V_SQL1        VARCHAR2(100);
  V_COUNT       NUMBER(20) := 0;
  V_SQL_TRIM    VARCHAR2(4000);
  V_DS          STA_NET_CDR_DAY_DS_D_E%ROWTYPE;
  TYPE REF_CURSOR IS REF CURSOR;
  C_DS REF_CURSOR;

BEGIN
  P_NUMBER := 0;
  --1)拼接目标表和中间表
  V_TABLE_NAME  := 'NET_CDR_DAY_DS_' || V_LOCAL;
  V_ST_TAB_NAME := 'STA_NET_CDR_DAY_DS_D_' || V_LOCAL;
  --2)删除三个月之前数据,只保留三个月数据
  EXECUTE IMMEDIATE 'DELETE FROM ' || V_TABLE_NAME ||
                    ' WHERE RATE_DT = TO_CHAR(TO_DATE(''' || V_DATE_CD ||
                    ''', ''YYYY-MM-DD'') - 100, ''YYYYMMDD'')';
  --3)删除当天加载过的数据
  EXECUTE IMMEDIATE 'DELETE FROM ' || V_TABLE_NAME || ' WHERE CREATE_DT = ''' ||
                    V_DATE_CD || ''' OR CREATE_DT = TO_CHAR(TO_DATE(''' ||
                    V_DATE_CD || ''',''YYYY-MM-DD'')+1, ''YYYYMMDD'')';
  COMMIT;
  -- 4)索引制失效
  SELECT COUNT(1)
    INTO L_COUNT
    FROM USER_INDEXES
   WHERE TABLE_NAME = V_TABLE_NAME
     AND TABLE_OWNER = 'xxxxx';
  IF L_COUNT > 0 THEN
    SP_INDEX_DISABLE(V_TABLE_NAME);
  END IF;
  --5)取目标表字段
  T_SP_GET_TAB_COMUMN(V_TABLE_NAME, V_SQL,V_SQL_TRIM, V_SQL_VALUE);
  --6)插入目标表
  V_SQL1 := 'SELECT * FROM ' || V_ST_TAB_NAME;
  OPEN C_DS FOR V_SQL1;
  LOOP
    FETCH C_DS
      INTO V_DS;
    EXIT WHEN C_DS%NOTFOUND;
    EXECUTE IMMEDIATE 'INSERT INTO ' || V_TABLE_NAME || '(' || V_SQL ||
                      ') VALUES(' || V_SQL_VALUE || ')'
      USING
      trim(V_DS.BIL_ASSET_ROW_ID),
      trim(V_DS.STD_CDR_TYPE_LVL5_CD),
      trim(V_DS.SYS_NAME),
      trim(V_DS.CALLING_DT),
      trim(V_DS.RATE_DT),
      trim(V_DS.BRD_FLG),
      trim(V_DS.USER_NAME),
      trim(V_DS.DUR),
      trim(V_DS.BIL_DUR),
      trim(V_DS.CNT),
      trim(V_DS.IN_BYTE),
      trim(V_DS.OUT_BYTE),
      trim(V_DS.NARROW_BAND_AMT),
      trim(V_DS.NARROW_BAND_DISCT_AMT),
      trim(V_DS.IF_NO_BIL_FLG),
      trim(V_DS.NO_ASSET_FLG),
      trim(V_DS.CREATE_DT),
      trim(V_DS.LAST_UPD_DT),
      trim(V_DS.LATN_ID);
    V_COUNT := V_COUNT + 1;
    IF MOD(V_COUNT, 2000) = 0 THEN
      COMMIT;
    END IF;
  END LOOP;
  COMMIT;
  CLOSE C_DS;
  --7)索引重建
  SP_INDEX_REBUID(V_TABLE_NAME);
EXCEPTION
  WHEN OTHERS THEN
    ROLLBACK;
    P_NUMBER := SQLCODE;
    DBMS_OUTPUT.PUT_LINE(SQLERRM);
END T_CHANGE_NET_CDR_DAY_DS;



谢谢先!

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


----------------------------------------

大会官网>>
TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表