求教:
我现在有几十亿的数据条目需要插入数据库,目前没有建索引,使用存储过程。
我在数据库建如下存储过程:
create or replace procedure procedure_insert_001
(
p_sname in varchar2,
p_snum in number,
p_sloc in varchar2
) as
begin
insert into t_costumer(sname,snum,sloc) values(p_sname,p_snum,p_sloc);
commit;
end procedure_insert_001;然后在vc中,用一个list存储了上万条记录(多次循环),然后call procedure_insert_001(参数1,参数2,参数3);然后执行,excute
大概流程就是这样,但是效率特别低,插入了两三天了,才插入1亿条。
我想问问这是什么原因呢?我该怎么设计呢?谢谢大家。
我现在有几十亿的数据条目需要插入数据库,目前没有建索引,使用存储过程。
我在数据库建如下存储过程:
create or replace procedure procedure_insert_001
(
p_sname in varchar2,
p_snum in number,
p_sloc in varchar2
) as
begin
insert into t_costumer(sname,snum,sloc) values(p_sname,p_snum,p_sloc);
commit;
end procedure_insert_001;然后在vc中,用一个list存储了上万条记录(多次循环),然后call procedure_insert_001(参数1,参数2,参数3);然后执行,excute
大概流程就是这样,但是效率特别低,插入了两三天了,才插入1亿条。
我想问问这是什么原因呢?我该怎么设计呢?谢谢大家。
解决方案 »
- 请教下oracle的OracleBulkCopy方法是否支持事务处理?
- 请教oracle11g客户端乱码的问题
- 用的hibernate把sqlserver换成oracle报错!
- oracle监听器启动不了
- rman备份问题
- 刚才误删了表中的数据,请问有什么方法可以快捷的恢复数据?
- 修改了机器名字和ip,oracle dba studio不能正常连接到数据库实例。请问如何解决!
- SqlServer里的exsits功能在oracle中怎么实现??急!!!
- 什么工具可以查看归档日志
- oracle apex 新编了个报表系统,能实现分层次填报和汇总。感觉apex挺好的。感兴趣的可以交流一下。
- 怎么查ADO的函数,如Execute,Open之类的
- sql怎么合并定行数据到查询结果集
首先找到你程序的瓶颈在哪 (是插入的时候慢、还是读取数据源的时候慢)?如果像你说的 list 里面存到上万条记录,你岂不是要调用 上万次存储过程?
至少这里可以这么做:
利用PreparedStatemnet 的addBatch 然后设定次数 execute 、commit.
使用外部表也是一种不错的选择
用VC去读OS的文件即使你的内存很大,但是依然会比较慢,因为这是多次IO操作,然后你再插入数据库,我觉得也会很慢。而且一条一条的插入数据确实不如批量插入数据快啊。如果真的是几十亿条记录在os文件中,推荐还是sql*loader吧。
你可以把大文件转储成一个个的小文件,然后并行插入,估计会好很多。
不过我没试过在vc里面调用sqlloader,但是用system('')应该也行吧
但是如果你喜欢用手写Insert,建议使用hints方式并行插入把
select /* parallel(tablename,4) from tables nologing;
搞错了 这个
http://www.blogjava.net/19851985lili/articles/110340.html
12 # 终结