首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

求批量安插sql优化方法

2012-12-16 
求批量插入sql优化方法for(){// 10000+insert_sql insert /*+append */ into RPTBOSJTEST(DWZD_BH,BBZD

求批量插入sql优化方法


for(){   // 10000+
insert_sql =
                        " insert /*+append */ into RPTBOSJTEST(DWZD_BH,BBZD_BH,BBZD_DATE,HZD_ZB,LZD_ZB,DYZD_SJ,DYZD_DATA,DYZD_FLAG,H_BZBM)"
                        + " values('"+DWZD_BH+"','"+BBZD_BH+"','"+BBZD_DATE+"', "
                        + HZD_ZB+ ","
                        + LZD_ZB+ ","
                        + " '"+DYZD_SJ+"', "
                        + DYZD_DATA +","
                        + 0 + ","
                        + " '' )" ;
                bost.addBatch(insert_sql);
                num ++ ;
                if(num == 500){
                    bost.executeBatch();
                    bost.clearBatch();
                    num = 0 ;
                }


循环插入 大约有10000条插入操作的时候 需要3分钟。。。。。。
做法是 每500条 插入一次
太慢 。。。。 求优化方法 。。。
在 sybase12.5上执行的
[最优解释]

--这是戴大大的原创,你可以参照下,趁着戴大还没来,我偷偷的转
Oracle 插入大量数据 收藏

1. 采用高速的存储设备,提高读写能力,如:EMC 和NetApp,

2. 假如tab1表中的没有数据的话 
DROP   TABLE   TAB1;
CREATE   TABLE   TAB1   AS   SELECT   *   FROM   TAB2;
然后在创建索引

3. 用Hint 提示减少操作时间

    INSERT   /*+Append*/   INTO     tab1
                SELECT   *   FROM   tab2;

4. 采用不写日志及使用Hint提示减少数据操作的时间。

建议方案是先修改表为不写日志:
sql> alter   table   table_name   NOLOGGING;

插入数据:

INSERT   /*+Append*/   INTO     tab1
      SELECT   *   FROM   tab2;

插入完数据后,再修改表写日志:


sql> alter   table   table_name   LOGGING;

这里的区别就在于如果插入数据的同时又写日志,尤其是大数据量的insert操作,需要耗费较长的时间。

5. 用EXP/IMP 处理大量数据

(1)给当前的两个表分别改名
alter   table   tab1   rename   to   tab11;
alter   table   tab2   rename   to   tab1;
(2)导出改名前的tab2
exp   user/pwd@...   file=...   log=...   tables=(tab1)
(3)把名字改回来
alter   table   tab1   rename   to   tab2;
alter   table   tab11   rename   to   tab1;
(4)导入数据
imp   user/pwd@...   file=...   log=...   fromuser=user   touser=user   tables=(tab1) 


http://blog.csdn.net/tianlesoftware/archive/2009/10/30/4745144.aspx


[其他解释]
在java端用循环插入数据是快不起来的。
批量插入数据,如果需要循环,尽量使用存储过程来完成吧。
[其他解释]
引用:
在java端用循环插入数据是快不起来的。
批量插入数据,如果需要循环,尽量使用存储过程来完成吧。

确实用存储过程来做你的循环插入要快些。
[其他解释]
引用:
Java code

for(){   // 10000+
insert_sql =
                        " insert /*+append */ into RPTBOSJTEST(DWZD_BH,BBZD_BH,BBZD_DATE,HZD_ZB,LZD_ZB,DYZD_SJ,DYZD_DATA,DYZD_FLAG,H_BZBM)"
            ……

到sysbase 去问吧

oracle 是采用装载 跟你写的类似  把表 alter table tb nologging
[其他解释]
.....
[其他解释]
或者你可以google下data pump
[其他解释]
ls的方法不太行啊 。。。
 alter   table   table_name   NOLOGGING
在我的sybase版本里也不能用
[其他解释]
问题已解决,加入了一块事物处理,谢谢各位。
[其他解释]
怎么解决的给分享一下啊
[其他解释]
也不告诉解决办法
[其他解释]
晕,解决了,也不发解决方法,给我们看下。共享下嘛

热点排行