大量数据插入如何调优

大家好:

      我有这样一条语句:insert into A(。。。。) select 。。。。。from B


B表有1800w左右的数据量,多年的,平均每年记录数在400w左右,我现在只查询并插入1年的数据量,都非常非常慢,年度字段有建索引。

是不是一次性查出并插入这么多记录数,不合理?如果要分开插入,如何处理合适?盼指点
参与21

20 同行回答

wangyax wangyax 软件开发工程师 金融机构
涉及到表间数据复制的问题,你可以考虑使用如下方式,数据按页写入真的是非常的快。declare c1 cursor for select * from Bload from c1 of cursor insert into A显示全部
涉及到表间数据复制的问题,你可以考虑使用如下方式,数据按页写入真的是非常的快。
declare c1 cursor for select * from B
load from c1 of cursor insert into A 收起
互联网服务 · 2012-11-01
浏览719
wksw wksw 数据库管理员 国外银行
看看select的explain plan吧,应该有improve的空间。另外,既然用存储过程,就有了更大的调整空间。可以考虑将复杂SQL分解成多个小而简单SQLs,可能效果更佳。显示全部
看看select的explain plan吧,应该有improve的空间。另外,既然用存储过程,就有了更大的调整空间。可以考虑将复杂SQL分解成多个小而简单SQLs,可能效果更佳。 收起
金融其它 · 2012-09-28
浏览681
huangxin huangxin 其它 河南拓普计算机网络工程有限公司
:'(郁闷死啦,我都明白啦显示全部
:'(郁闷死啦,我都明白啦 收起
IT分销/经销 · 2012-09-28
浏览688
xiewenpeng xiewenpeng 数据库开发工程师 河南众品
回复 16# hero__ma     兄弟 ,这样直接在你运行SQL的页面调用存储过程不用再编译"SELECT 或 VALUES 语句的列 "1" 与表列 "1" 不兼容",看你的select后面的列和目标列显示全部
回复 16# hero__ma


    兄弟 ,这样直接在你运行SQL的页面调用存储过程
不用再编译

未命名.bmp



"SELECT 或 VALUES 语句的列 "1" 与表列 "1" 不兼容",看你的select后面的列和目标列 收起
互联网服务 · 2012-09-28
浏览723
代码改成:         declare mycur cursor for     SELECT DATE(A.BUSINESS_DATE),A.ORG_CD         ,A.EX_ORG_CD         ,B.EXPORT_FLAG   ...显示全部
代码改成:
         declare mycur cursor for
     SELECT DATE(A.BUSINESS_DATE),A.ORG_CD
         ,A.EX_ORG_CD
         ,B.EXPORT_FLAG
         ,A.LEAF_TYPE_CD,A.LEAF_VARIETY_CD
         ,B.LEAF_RANK_CD
         ,B.LEAF_LEVEL_CD,B.LEAF_LEVEL_NO
                 ,(SELECT MAX(C.LEAF_TYPE_NAME) FROM CM_LEAF_TYPE C WHERE A.LEAF_TYPE_CD=C.LEAF_TYPE_CD)
                 ,A.LEAF_VARIETY_NAME
                 ,B.LEAF_RANK_NAME,B.LEAF_LEVEL_NAME         
         ,SUM(B.WEIGHT),SUM(B.AMOUNT),SUM(B.SUB_AMOUNT1+B.SUB_AMOUNT2)
                 ,0,0
     FROM BU_BUYINVOICE_MAS A,
         BU_BUYINVOICE_DETAIL B
     WHERE A.BUYINVOICE_MAS_ID = B.BUYINVOICE_MAS_ID
         AND A.BUSINESS_YEAR = BUSINESS_YEAR
     GROUP BY DATE(A.BUSINESS_DATE),A.ORG_CD
         ,A.EX_ORG_CD
         ,B.EXPORT_FLAG
         ,A.LEAF_TYPE_CD,A.LEAF_VARIETY_CD,B.LEAF_RANK_CD
         ,B.LEAF_LEVEL_CD,B.LEAF_LEVEL_NO
                 ,A.LEAF_VARIETY_NAME
                 ,B.LEAF_RANK_NAME,B.LEAF_LEVEL_NAME;
         
      call SYSPROC.ADMIN_CMD('LOAD FROM (     SELECT DATE(A.BUSINESS_DATE),A.ORG_CD
         ,A.EX_ORG_CD
         ,B.EXPORT_FLAG
         ,A.LEAF_TYPE_CD,A.LEAF_VARIETY_CD
         ,B.LEAF_RANK_CD
         ,B.LEAF_LEVEL_CD,B.LEAF_LEVEL_NO
                 ,(SELECT MAX(C.LEAF_TYPE_NAME) FROM CM_LEAF_TYPE C WHERE A.LEAF_TYPE_CD=C.LEAF_TYPE_CD)
                 ,A.LEAF_VARIETY_NAME
                 ,B.LEAF_RANK_NAME,B.LEAF_LEVEL_NAME         
         ,SUM(B.WEIGHT),SUM(B.AMOUNT),SUM(B.SUB_AMOUNT1+B.SUB_AMOUNT2)
                 ,0,0
     FROM BU_BUYINVOICE_MAS A,
         BU_BUYINVOICE_DETAIL B
     WHERE A.BUYINVOICE_MAS_ID = B.BUYINVOICE_MAS_ID
         AND A.BUSINESS_YEAR = BUSINESS_YEAR
     GROUP BY DATE(A.BUSINESS_DATE),A.ORG_CD
         ,A.EX_ORG_CD
         ,B.EXPORT_FLAG
         ,A.LEAF_TYPE_CD,A.LEAF_VARIETY_CD,B.LEAF_RANK_CD
         ,B.LEAF_LEVEL_CD,B.LEAF_LEVEL_NO
                 ,A.LEAF_VARIETY_NAME
                 ,B.LEAF_RANK_NAME,B.LEAF_LEVEL_NAME) OF CURSOR insert into B_BUY_SUM ') ;


call时候提示:SELECT 或 VALUES 语句的列 "1" 与表列 "1" 不兼容。源列具有 sqltype
"384",而目标列具有 sqltype "496"。
这是什么原因? 收起
2012-09-28
浏览717
就是换掉了以后,会编译不通过显示全部
就是换掉了以后,会编译不通过 收起
2012-09-28
浏览686
xiewenpeng xiewenpeng 数据库开发工程师 河南众品
回复 14# hero__    把我的“select * from test” 用你 的select 语句 替换掉,insert 后面的表名也换成你的表显示全部
回复 14# hero__


    把我的“select * from test” 用你 的select 语句 替换掉,insert 后面的表名也换成你的表 收起
互联网服务 · 2012-09-28
浏览693
过程要编译完才能call 啊我现在不能白;SYSPROC.ADMIN_CMD中的那段,select要查什么。你看我上面贴的代码了吗?按那个说吧,要如何写SYSPROC.ADMIN_CMD中的内容显示全部
过程要编译完才能call 啊
我现在不能白;SYSPROC.ADMIN_CMD中的那段,select要查什么。
你看我上面贴的代码了吗?按那个说吧,要如何写SYSPROC.ADMIN_CMD中的内容 收起
2012-09-28
浏览688
xiewenpeng xiewenpeng 数据库开发工程师 河南众品
回复 12# hero__ma 直接调用 这个存储过程,不需要啥编译    call SYSPROC.ADMIN_CMD('LOAD FROM (select * from test) OF CURSOR insert into test1 ')显示全部
回复 12# hero__ma

直接调用 这个存储过程,不需要啥编译
    call SYSPROC.ADMIN_CMD('LOAD FROM (select * from test) OF CURSOR insert into test1 ') 收起
互联网服务 · 2012-09-28
浏览690
。。。。xiewenpeng:能讲明白点吗?我按你那个,替换了下,编译都编译不过去显示全部
。。。。xiewenpeng:
能讲明白点吗?我按你那个,替换了下,编译都编译不过去 收起
2012-09-28
浏览690

提问者

评论0

问题状态

  • 发布时间:2012-09-27
  • 关注会员:1 人
  • 问题浏览:6748
  • 最近回答:2012-11-01
  • X社区推广