大批量CSV文本文件入库,哪种方式效率比较高???

teleinfor 2007-10-10 05:33:37
大批量CSV文件导入SQL数据库,哪种效率最快???我的数据量可能会有几十万行或者更多.结合您的经验,以下三种方法或者其他方法.哪种最高效???

1.读取CSV文件,自己解析然后利用SQL insert插入
2.利用ADO的AddNew()/UpdateBatch(),不过也要首先读取CSV解析
3.insert into mytable select * from opendatasource(...)...[myfile#CSV]

我已经测试了方法3,导入14万行数据大概费时3~5分钟.

谢谢楼下Xd的帮忙...
...全文
1278 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
foolishzwt 2009-02-23
  • 打赏
  • 举报
回复
要用到这个,学习了,谢谢各位
teleinfor 2007-10-15
  • 打赏
  • 举报
回复
楼上的XD说的法可行么?我调整了我的数据库connection string现在可以14万行数据1分钟导入了.用的也是OpenDataSource()/OpenRowSet()两个函数性能差不多.就准备这么用了.

希望此帖的结论能够给其他遇到CSV/TXT文件处理的朋友帮助 :)
shakaqrj 2007-10-11
  • 打赏
  • 举报
回复
只能学习了
我的导入语句是
m_pConn->Execute("SELECT * INTO lib8 FROM [text;database=d:\\].tmp.txt ORDER BY manu_24, devi_32",0,adCmdText+adExecuteNoRecords);
teli_eurydice 2007-10-11
  • 打赏
  • 举报
回复
实在是不行你那就自己读 CSV 文件生成不带引号的文件,然后再 BULK INSERT ,很快,以阿坝5万行的15秒搞定
teleinfor 2007-10-11
  • 打赏
  • 举报
回复
这里的人气怎么不太好了....CSDN的讨论气氛感觉越来越低沉了....:(...
teleinfor 2007-10-10
  • 打赏
  • 举报
回复
刚又做了几次测试,发现Opendatasource/openrowset的差别很小了 :( 有时候甚至发现Opendatasource快了。。。晕倒了。。。。这到底哪个效率高啊。。。。我晕死。。。。

SQL Server 2005 Express Edition我用的库。
teleinfor 2007-10-10
  • 打赏
  • 举报
回复
刚我也试验了OpenRowSet(),并且对比了OpenDataSource():后者相比前者对于14万行的数据量而言快速,前者费时3:20,后者费时2:16。多次实验后,结论都差不多。

不知道这个能说明什么,证明什么?14万的数据量对于批量量数据处理而言,能够验证性能么?

BULK Insert对于双引号("value")不能格式化去掉那个"",这个不符合我的要求,OpenRowSet/OpenDataSource都可以格式化("value")数据。
teleinfor 2007-10-10
  • 打赏
  • 举报
回复
琢磨了半天,这么写就OK乐。

truncate table [user]

go

insert into [user]
select * from
openrowset('Microsoft.Jet.OLEDB.4.0','TEXT;HDR=YES;FMT=Delimited;Database=C:\',test#csv)

go

select * from [user]

go
teleinfor 2007-10-10
  • 打赏
  • 举报
回复
最好不要,我是给用户用来导入好几个种类的csv文件。
我不会用OpenRowSet的语法,比如用MICROSFT.JET.OLEDB.4.0驱动的写法。
shakaqrj 2007-10-10
  • 打赏
  • 举报
回复
我把文本文件导进access的时候,需要一个schema.ini文件来对导入格式进行说明
不知道,你这个需不需要?
teleinfor 2007-10-10
  • 打赏
  • 举报
回复
能否举例使用OpenRowSet()
我写的
insert into mytable
select * from
OpenRowSet('Microsoft.Jet.OLEDB.4.0','Data Source="C:\",Extended Properties="TEXT;HDR=YES;FMT=Delimited"')...[test#csv]
提示有错误。
我是根据OpenDataSource()写的。如果换成OpenDataSource()就可以执行。

请指点。。。谢谢XD们乐。
shakaqrj 2007-10-10
  • 打赏
  • 举报
回复
我忘了从insert到updatebatch提高多少了
但是从updatebatch到一次性导入,是从一分钟左右到十几秒(整个过程)
其中,仅updatebatch和导入语句的时间大概是半分钟到几秒钟
当然,我的那个导入语句貌似是专门对应access的
专门对sql的是不是就是3楼的 BULK INSERT ?
teleinfor 2007-10-10
  • 打赏
  • 举报
回复
刚测试了
bulk insert mytable from 'C:\tset.csv'
with
(
...
)
可是不满足要求。没办法使用啊。
我的数据如下格式
............................
"1","12","12","32","32","122"
............................
结果导入的数据居然是“ "1" ”,双引号我不要的。

不知道OpenRowSet如何???我用OpenDataSource()可以去掉""的。
teleinfor 2007-10-10
  • 打赏
  • 举报
回复
OpenRowSet和OpenDataSource相比而言,效果区别如何?
teleinfor 2007-10-10
  • 打赏
  • 举报
回复
bcp命令等系统工具,对我这里可能不太可行,我用的数据库SQL Server 2005 Express Edition,本身对工具的支持都是有限制的吧。

所以还是重点考虑我提到的三种方法。不知道2、3楼提到的方法大概效率如何??具体数字?
dyw 2007-10-10
  • 打赏
  • 举报
回复
使用bcp命令。
teli_eurydice 2007-10-10
  • 打赏
  • 举报
回复
用 BULK INSERT 很快

http://technet.microsoft.com/zh-cn/library/ms175915.aspx
shakaqrj 2007-10-10
  • 打赏
  • 举报
回复
我觉得3效率最高...
updatebatch其次
insert最差
不过如果是存储过程的话,我就不知道了,但应该不会超过3吧

以前是把数据写入access的,所以没有存储过程(查询只能部分代替存储过程)
一开始以一条条insert
后来改成总的updatebatch,效率明显提高
最后又改成,先写入文本,最后一次性导入,结果就几秒钟
我的是四万多条数据

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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