寻求批量插入远程数据的方案

dfwxj 2012-06-04 11:13:25
需要将数据批量插入远程服务器,远程服务器是SQL,用什么方案效率最高、速度最快?

例如:本地数据有10000条,

日期 品名 数量
2012.06.06 中华牙膏 20
2012.06.06 白玉牙膏 50
。。。
。。。
。。。

我用如下代码测试了一下,上当了,等了半小时多!!
?sqlstringconnect("Driver=SQL Server;Server=192.168.0.2;Address=XX.XX.XX.XX,1500;Network=dbmssocn;Database=yjtest;Uid=wxj;Pwd=123")
SET TALK off

FOR i=1 TO 10000
SQLEXEC(1,"insert into ydj values('2012.06.06','阿莫西林',12)")
endf
SET TALK on

RETURN


然后我改一下,记录了时间,300条记录花了70秒

我的网络上行速率是512K

什么方案效率高?应该在哪些方面进行优化?比如说充分利用字节长度等等


有可能同时多个站点上传数据,这样会不会死人?

...全文
316 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
都市夜猫 2012-06-05
  • 打赏
  • 举报
回复
如果 sql server 所在服务器安装了 ftp,那就先将数据整理成符合字段顺序的格式化文本文件,上传文件,再导入 sql server
ftp 传文件就不用说了,只说说导入 sql server
最快的应该是 bulk insert 命令了,简化的语法是这样的:
BULK INSERT 被插入表名
FROM 'C:\数据文件.txt'
WITH
(
FIELDTERMINATOR = ",", -- 指定逗号作为字段分隔符,默认是制表符 \t
ROWTERMINATOR = "\n" -- 指定 回车符号作为 行分隔符,默认是 \r\n
)

完整的语法是:
BULK INSERT 
[ database_name . [ schema_name ] . | schema_name . ] [ table_name | view_name ]
FROM 'data_file'
[ WITH
(
[ [ , ] BATCHSIZE = batch_size ]
[ [ , ] CHECK_CONSTRAINTS ]
[ [ , ] CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' } ]
[ [ , ] DATAFILETYPE =
{ 'char' | 'native'| 'widechar' | 'widenative' } ]
[ [ , ] FIELDTERMINATOR = 'field_terminator' ]
[ [ , ] FIRSTROW = first_row ]
[ [ , ] FIRE_TRIGGERS ]
[ [ , ] FORMATFILE = 'format_file_path' ]
[ [ , ] KEEPIDENTITY ]
[ [ , ] KEEPNULLS ]
[ [ , ] KILOBYTES_PER_BATCH = kilobytes_per_batch ]
[ [ , ] LASTROW = last_row ]
[ [ , ] MAXERRORS = max_errors ]
[ [ , ] ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) ]
[ [ , ] ROWS_PER_BATCH = rows_per_batch ]
[ [ , ] ROWTERMINATOR = 'row_terminator' ]
[ [ , ] TABLOCK ]
[ [ , ] ERRORFILE = 'file_name' ]
)]

所有选项的说明参见微软帮助:http://msdn.microsoft.com/en-us/library/ms188365.aspx
dfwxj 2012-06-05
  • 打赏
  • 举报
回复
下午先换一台服务器测试
敦厚的曹操 2012-06-05
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

好的,先谢谢各位弟兄。

现在第一件事是整理服务器,破服务器就没重装过系统,昨天FTP没建成功。

网速就不管了,最慢的是我自己的,10M共享。其他的都是起跑10的专线。

先这样了;

通过 FTP 将 数据文件 UpLoad 到 服务器,然后再用
BULK INSERT

Insert Into 已经存在的SQL表名 (列名1,列名2...) Select (……
[/Quote]

加油!!希望你能解决问题!
dfwxj 2012-06-05
  • 打赏
  • 举报
回复
好的,先谢谢各位弟兄。

现在第一件事是整理服务器,破服务器就没重装过系统,昨天FTP没建成功。

网速就不管了,最慢的是我自己的,10M共享。其他的都是起跑10的专线。

先这样了;

通过 FTP 将 数据文件 UpLoad 到 服务器,然后再用
BULK INSERT

Insert Into 已经存在的SQL表名 (列名1,列名2...) Select (对应列名1,对应列名2...) From openrowset
wwwwb 2012-06-05
  • 打赏
  • 举报
回复
用openrowset,要求远程数据(比如MDB、DBF)在服务器上
十豆三 2012-06-05
  • 打赏
  • 举报
回复
通过 FTP 将 数据文件 UpLoad 到 服务器,然后再用
BULK INSERT

Insert Into 已经存在的SQL表名 (列名1,列名2...) Select (对应列名1,对应列名2...) From openrowset
wwwwb 2012-06-05
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

没仔细看,bulk insert也需要先将数据传至远程服务器的吧~~~~

如果直接写入远程数据库有没有更快的方案?
[/Quote]
4楼的方法2测试没有
十豆三 2012-06-05
  • 打赏
  • 举报
回复
我认为优先要处理的顺序为:
1、网速
2、FTP 到服务器
3、BULK INSERT

Insert Into 已经存在的SQL表名 (列名1,列名2...) Select (对应列名1,对应列名2...) From openrowset('。。。。
4、SPT 一条一条插入(原方法)
dfwxj 2012-06-05
  • 打赏
  • 举报
回复
没仔细看,bulk insert也需要先将数据传至远程服务器的吧~~~~

如果直接写入远程数据库有没有更快的方案?
dfwxj 2012-06-05
  • 打赏
  • 举报
回复
网速已经不错了,要更快只能装专线了。2M、4M只是下行速率,我的下行是10M,上行只有512K。远程是100M专线,固定IP,下行速率足够。

测试300条记录时当然是将10000改成了300,然后在前后记录时间

此系统需要在特定的时候大批量上传数据.

bulk insert首选,FTP上传然后在服务器端导入也可以。优选远程传输快的方案。
十豆三 2012-06-05
  • 打赏
  • 举报
回复
提高网速也是比较重要的。
wwwwb 2012-06-05
  • 打赏
  • 举报
回复
用ADO连接任意1个MDB、DBF、TXT等等,再执行上述SQL语句
wwwwb 2012-06-05
  • 打赏
  • 举报
回复
循环不用考虑,
1、用SQLSERVER的OPENDATESOURCE、OPENQUERY、BULK;
2、用JETSQL,假设连接SQLSERVER,并有相应权限,且字段类型没有特殊(如GEN、BLOB之类)
SELECT * INTO [dbase 5.0;database=r:\temp].aa FROM [ODBC;Driver=SQL Server;UID=sa;PWD=123;Server=tmp;DataBase=tmp].bb;
敦厚的曹操 2012-06-05
  • 打赏
  • 举报
回复
1、从环境角度应该提高网速(本机网速和远程服务器网速)和服务器的配置性通。
2、ftp的方法,本觉得不可取,因为,还得需要远程服务端导入入数据库的操作。
3、关于【bulk insert】方法,确实能够提高插入速度,效果明显,这里有更详细的中文讲解,你可以参考一下:
http://blog.csdn.net/jackmacro/article/details/5959321
4、按照你的数据,300条记录如果用了70秒时间,那你的网速太慢了,不是服务器端,就是你本机,现在家庭都是2-4M的宽带,你可以换一个家庭4M机器试试,看速度有无提高。另外,是不是你用的是10000条数据,
FOR i=1 TO 10000
SQLEXEC(1,"insert into ydj values('2012.06.06','阿莫西林',12)")
endf
&& 是不是10000,把10000改成300
5、通过文本文件进行处理,速度也很快,参考下面的帖子。
http://www.itpub.net/thread-139879-4-1.html
dfwxj 2012-06-04
  • 打赏
  • 举报
回复
将数据打包采用FTP上传会不会快些?

2,718

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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