在csdn上面看了N多的文章,在讨论文本文件导入到数据库,其中涉及到最重要的问题,莫过于效率问题了。导入的过程中,一般认为有两个瓶颈:1、read和readln的I/O读写效率问题;
2、数据库的Append 或者insert效率问题。一般来说,对于第二种,大家都会提出来,使用insert的时候,不要单独提交一条,而是要批量提交N条进行处理。至于还有没有进一步的方法,所说的就不多了。
这里有一个值得质疑的地方,就是TQuery里面的SQL属性,能够支持过多的SQL语句么?这样在数据库服务器端执行程序的时候会不会出问题?比如SQL命令过长?
对于第一点,很多人又提出来不要使用readln一行一行地读,而是要批量地读入,或者是使用TstringList或者TMemo这样的loadfromfile方法。使用loadfromfile这样的方法,有一个很大的局限性,就是,当文件比较大的时候,比如我经常要处理的文本文件一般都高达600MB的,适用这个方法,基本上程序就相当于死机了。
不知道大家有没有什么好的方法,批量地读入呢?我曾经想到过blockread,但是好像没有办法在buffer里面读出一行行的纪录。唉,谁有好的方法,请跟帖讨论吧。最好是写出具体的代码。
2、数据库的Append 或者insert效率问题。一般来说,对于第二种,大家都会提出来,使用insert的时候,不要单独提交一条,而是要批量提交N条进行处理。至于还有没有进一步的方法,所说的就不多了。
这里有一个值得质疑的地方,就是TQuery里面的SQL属性,能够支持过多的SQL语句么?这样在数据库服务器端执行程序的时候会不会出问题?比如SQL命令过长?
对于第一点,很多人又提出来不要使用readln一行一行地读,而是要批量地读入,或者是使用TstringList或者TMemo这样的loadfromfile方法。使用loadfromfile这样的方法,有一个很大的局限性,就是,当文件比较大的时候,比如我经常要处理的文本文件一般都高达600MB的,适用这个方法,基本上程序就相当于死机了。
不知道大家有没有什么好的方法,批量地读入呢?我曾经想到过blockread,但是好像没有办法在buffer里面读出一行行的纪录。唉,谁有好的方法,请跟帖讨论吧。最好是写出具体的代码。
解决方案 »
- 如何加快delphi webbrowser1载入网页的速度
- 急!!!关于C/S连接问题以及数据库访问问题
- 调用存储过程,得不到返回值啊,怎么回事?
- 为什么我在客户端查询数据时,如果出现汉字出就报错!!!!!!!
- 用ClientDataSet1怎样把图片存入ms sql server 的images中和显示在dbimage中。
- SNMP 修改 設備 ip 問題--100分
- 请进来看一看这个错误提示是什么意思?
- 怎么给已经有的unit重命名????????(牛虻)
- 有唯知道广东省省花是什么?
- TServerSocket等怎样传递图片?
- 关于一个流的操作,小弟着急,救命呀!!(在线等待)
- 鲨鱼请教:今天面试的问题?
我没有办法适用dfw的全文检索,你能够帮忙帖出来那个帖子么?另外,希望有人说说我提出的几个问题啊。还有,DTS的调用是通过什么来进行啊?有没有函数式或者是API方式的接口?
我现在就用这种方式读DBF文件,将它导入到ORACLE中
我使用过dataset的方式进行插入,也使用过直接传递insert命令到服务器段执行,结果都一样是很慢的,大概用了两分多钟,导入一个2Mb的文本文件。而我注释掉插入数据库的命令之后,对整个文本的分析,只用了2秒钟!sigh
优化看来插入数据库的过程,才能够真正提高效率。
关键在此,有哪位高手推荐一些方法?探讨一下吧?
Oracle 8.0.5+Linux
client Piii700+128M
server HP lh6000,1G mem,one 700M CPU,100M Nic
平均每秒2000条,记录长度平均100 BYTE
我没怎么写过存储过程,大家见笑了,不过可以用,也是批量插入的。/****** Object: Stored Procedure dbo.charu Script Date: 2004-3-7 9:11:12 ******/
CREATE PROCEDURE dbo.charu
@path varchar(50),--文本文件路径
@file varchar(50),--文件名
@username varchar(50)
AS
set nocount on
declare @aaa varchar(1000)
declare @bbb varchar(1000)
declare @ccc varchar(1000)
set @aaa='''Driver={Microsoft Text Driver (*.txt; *.csv)};DefaultDir='+@path+';'''
set @ccc='''select * from '+@file+''''
set @bbb='insert into car_info(cardnum,cartype,carbrand,carnum,color,zhuitao,drivername,shenfenzheng,dradress,phonenum,cardate,moneynum)
select * from OpenRowset('+'''MSDASQL'''+','+@aaa+','+@ccc+')'
exec (@bbb)set nocount offGO
Oracle 8.0.5+Linux
client Piii700+128M
server HP lh6000,1G mem,one 700M CPU,100M Nic
平均每秒2000条,记录长度平均100 BYTE
------------------你的这个是怎么样实现的阿?