100分求教:十万条数据,如何一次性插入数据库,才能保证效率?

tttk 2006-08-31 04:44:07
一个上报数据的项目,一次上报的数据记录量可能多达十几万条,甚至更多。

曾经想过用数据库提供的import/load工具来导入,但却苦于不知道如何在java中调用。

看了论坛里以前的一些帖子,对于大批量的插入操作,很多朋友都建议使用批插入方式(batchUpdate)。但如此巨量的数据如果一次性提交,是不是会极大的影响服务器性能?

麻烦大家给点建议,谢谢。
...全文
5501 63 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
63 条回复
切换为时间正序
请发表友善的回复…
发表回复
ljhxuer 2007-04-12
  • 打赏
  • 举报
回复
分页提取数据,然后再批量插入提取的数据
fest 2006-12-26
  • 打赏
  • 举报
回复
mark
skysss 2006-09-18
  • 打赏
  • 举报
回复
用JDBC装数据实在太慢.
一般做数据迁移还是用JAVA
调用外部进程(load ,import)比较实际.
参见runtime.exec吧.
tttk 2006-09-04
  • 打赏
  • 举报
回复
谢谢楼上。你的想法基本上和我不谋而合。

惟一的不同在于,在上传完毕后,还需要反馈数据中有错的部分。
zhb1208 2006-09-03
  • 打赏
  • 举报
回复
关注
tttk 2006-09-03
  • 打赏
  • 举报
回复
楼上的朋友,这是一个现实中遇到的问题,何疯之由?
yaray 2006-09-03
  • 打赏
  • 举报
回复
如果用户数据实时性不强的话,可以考虑以下方案:

用户操作后执行:
. 源数据导出到指定格式的文件(xml/txt/...)
. 上传数据文件
. 显示操作成功(用户有感知的部分完成)
----
. 后台定时执行(在访问量小的时间,比如后半夜):
. 从指定格式的文件导入数据,建立索引,....
====
以上仅为想法,未经实际测试.
bestrong 2006-09-01
  • 打赏
  • 举报
回复
奉劝楼主不要用临时表
除非服务器的内存特别大 ,不然会报内存错误中断服务的。
seawalt 2006-09-01
  • 打赏
  • 举报
回复
你用SQl事件探查器不就知道Sql Server是怎么import/output的?
SINCE1978 2006-09-01
  • 打赏
  • 举报
回复
mark
tttk 2006-09-01
  • 打赏
  • 举报
回复
测试结果:采用临时表的方式,插入10万条数据,只需要3~5秒。(包含日志,没建立索引)
gaoan 2006-09-01
  • 打赏
  • 举报
回复
这个帖子有点技术含量,关注。
tttk 2006-09-01
  • 打赏
  • 举报
回复
谢谢。plphoenix()你的经验对我很有帮助,我的确应该考虑一下分表或者临时表的方式。

现在有一个方案:每次插入一个临时表中,在该临时表中不使用日志,不建立索引。然后在后台进行数据的转储。用户得到反馈的时间将会很快。
dgrwang 2006-09-01
  • 打赏
  • 举报
回复
如果你能用工具连上数据库,那就直接用dts工具就可以,如果不可以,是web与数据库服务器分开的,那用sql语句
dgrwang 2006-09-01
  • 打赏
  • 举报
回复
sqlserver中用xp_cmdshell
例如
EXEC master..xp_cmdshell 'bcp pubs..title in e:\test.txt -c -t, -S127.0.0.1 -Usa -P '
这种是通过文本导入,可以通过参数修改,xp_cmdshell也可以导入excel
或者用BULK INSERT
例如
BULK INSERT pubs.dbo.[title] FROM 'e:\test.txt'
WITH (
DATAFILETYPE = 'char',
FIELDTERMINATOR= ',',
ROWTERMINATOR='
'
)
xp_cmdshell会有安全隐患,所以一般网站数据库管理员都可能会封,BULK INSERT在2000下没问题,在2005下好像验证更严格。
两个的速度,10w条都不超过10秒
plphoenix 2006-09-01
  • 打赏
  • 举报
回复
其实你可以先试一下插入1000条或多一点看看要多少时间,然后再算出来是不是能够接受这样的等待.
plphoenix 2006-09-01
  • 打赏
  • 举报
回复
以前是招行c/s下的sybase,项目里面也有部分功能是和你现在的一样的...
我以前是删除索引然后再建的,但是这个有个特点的,本身数据表内数据相对插入的数据不是多太多倍(300w/60w),所以会有点用处,lz现在这样可能不是太合适了,5000w的表建索引的话估计得半个小时了(我以前的服务器配置和你差不多,就是CPU是4个双核的).
我想要是我做的话我会通过先建临时表,然后直接插入主表.不删索引.写日志(其实要是直接把一张表全部插入到另一张表的话这个影响不了太多时间的,同时由于插入时间会比较长,所以为了防止意外还是应该写的).
其实现在的根本是这张表的大小相对硬件配置来说太大了,最好能分表
rikee19810706 2006-09-01
  • 打赏
  • 举报
回复
mark
leiyong000 2006-09-01
  • 打赏
  • 举报
回复
暂时关闭日志,直接在后台做吧
tttk 2006-09-01
  • 打赏
  • 举报
回复
呵呵,plphoenix() 何出此言啊?以前做过类似的项目?
加载更多回复(43)

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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