RT,我们要写一个存储过程,每天都要从源系统读入数据,但是有一个表挺大的,130多万条数据,虽然建立了分区,可以truncate,但是插入数据的时候 我用的是insert A select ... from B(select的字段中有一些计算处理的),这样就很慢了,请问有什么方法解决这个办法吗?
解决方案 »
- 求教一个解析数据表某字段字符串的问题
- 存储过程中能不能用表类型做参数?
- ORA-01461: can bind a LONG value only for insert into a LONG column
- pl/sql develop 存储过程 显示返回集
- 远程连接数据库
- 求助:在PL/SQL中能否像c++定义struct结构,如何初始化
- 求助max用法
- 怎么修改表空间名?不能修改吗?
- 我用PL/SQL DEVELOP把存储过程导出来了,但我不知道怎样可以把它导到数据库里,如果要拷贝到sql/plus里执行的话,文字太长了,要分很多次
- 有没有可能将ACCECC库中某张表的记录插到ORACLE中已有的表中去呢?
- oracle 追查某表的数据是从哪程序插入的
- 安装orcale检测时出错
如果上面的方法还是解决满足不了要求的话,那么可以尝试一下别的方法,比如使用Pro*C编写一个blk insert的程序,类似于SqlServer/Sybase的BCP的程序,应该可以把时间缩减到10分钟之内
--可以考虑用hint
--使用批量直接路径插入(归档模式使用nologging)可以减少undo及redo生成量
insert /*+ append */ into A nologging select * from b;
alter table tb nologginginsert /*+ append*/ into tb select * from tb alter table tb logging
谢谢,那么加上了*+ append和nologging有什么弊端吗?
在插入过程中如果数据库宕机,将无法保证数据库的一致性;
在数据库还原时无法通过归档日志恢复这样插入的数据;
使用 Data Guard 等依赖归档日志的数据库功能时,oracle 将无法处理使用此方法插入的数据。
-- 说的很好,不过:这种方法只能用在非Data Guard环境下!
-- 5楼也说的很好!