大批量数据插入提高性能

liukang1022 2009-12-30 03:33:54
Oracle数据库
现有两张表A、B,两张表结构一模一样,现在想把B表的数据全量插入A表中,B表数据大概40万

我的语句是:insert into A select * from B;

执行速度太慢了,有没有高手知道,怎么写能够提高速度,谢谢了!
...全文
303 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
bike_vagrant 2010-01-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 tianlesoftware 的回复:]
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)


Oracle 插入大量数据
http://blog.csdn.net/tianlesoftware/archive/2009/10/30/4745144.aspx


------------------------------------------------------------------------------
Blog: http://blog.csdn.net/tianlesoftware
网上资源: http://tianlesoftware.download.csdn.net
相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx
Q Q 群:62697716
[/Quote]

这个很详细了
bike_vagrant 2010-01-04
  • 打赏
  • 举报
回复
insert /*+append nologging+*/into a select * from b
碧水幽幽泉 2010-01-02
  • 打赏
  • 举报
回复
[Quote=引用楼主 liuk1022 的回复:]
Oracle数据库
现有两张表A、B,两张表结构一模一样,现在想把B表的数据全量插入A表中,B表数据大概40万

我的语句是:insert into A select * from B;

执行速度太慢了,有没有高手知道,怎么写能够提高速度,谢谢了!
[/Quote]merge into试试
ojuju10 2009-12-31
  • 打赏
  • 举报
回复
alter table a nologging;
insert /*+ APPEND */ into A select * from B;
SambaGao 2009-12-31
  • 打赏
  • 举报
回复
no logging
ma309385560 2009-12-30
  • 打赏
  • 举报
回复
Oracle forall 语句
FORALL语句的一个关键性改进,它可大大简化代码,并且对于那些要在PL/SQL程序中更新很多行数据的程序来说,它可显著提高其性能。
crazylaa 2009-12-30
  • 打赏
  • 举报
回复
merge into试试看:以下假设ID是PK,则此sql效率蛮高的,特别数据量大的时候
这是相同的进行修改。
merge into a
using (select id,name from b ) c
on(a.id=c.id )
when matched then update set a.name=c.name
when not matched then insert (a.id,a.name) values (c.id,c.name);
这是没有的进行插入。如果A是新表的话,不需要修改
merge into a
using (select id,name from b ) c
on(a.id=c.id )
when not matched then insert (a.id,a.name) values (c.id,c.name);
Dave 2009-12-30
  • 打赏
  • 举报
回复


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)


Oracle 插入大量数据
http://blog.csdn.net/tianlesoftware/archive/2009/10/30/4745144.aspx




------------------------------------------------------------------------------
Blog: http://blog.csdn.net/tianlesoftware
网上资源: http://tianlesoftware.download.csdn.net
相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx
Q Q 群:62697716

17,380

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧