导航
  • 主页
  • 基础类
  • 应用实例
  • 新技术前沿

大数据量插入,如何能够提速?

hchack 2007-11-28 02:48:22
数据库中只有一个字段,并且设置成了主键,每次需要插入1万个等长的字符和数字组合的字符串,我现在采用异常插入,数据库为空,插入1万条记录需要40s,如果再次插入,那就需要1分多钟,如果再多次插入,那时间就成倍的增长了,有什么好的办法解决吗?


数据:
ZT992800001CN
ZT992800002CN
...
ZT992810000CN

一共1万条记录,如果中间遇到重复的,那么就跳过,然后累计数量再加一,数据就变成了:
ZT992810001CN
...全文
161 点赞 收藏 14
写回复
14 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
nikefly 2008-01-04
路过,说一句:LZ做人要低调,不吃亏~~~只有低调才能学到好东西.
回复
ivyrich 2007-12-01
弱弱的问句, 能用 bulk insert吗?
回复
hchack 2007-12-01
select top 10000 ID=identity(1,1) into # from syscolumns a ,syscolumns b,syscolumns c
-------
生成递增:
insert T(Col)
select 'ZT9928'+right(100000+ID,4)+'CN' from #

------------------------------------------------------------------------------------------------------------

没看明白,能不能解释一下?
回复
hchack 2007-12-01
bulk insert 怎么避免重复数据的插入?
回复
mrzj 2007-12-01
這大量數據上傳本人設計過這樣項目。

不能使用ADO了,用ADO也就一次連接上傳8萬多行,而且速度也慢。

要用bulk insert或者用sql提供的數據轉換服務來設計上傳的dts運行包,保存後此包後用dtsrun命令來在操作系統的命令行下執行,或者直接在sql管理器下運行。

注意:
1、如果只是大量的文本數據就要先去掉表的索引,然後上傳,上傳完了在重建索引,這樣最快。
2、如果上傳的是大量的圖片數據等二進制數據,就別去掉索引了,否則重建索引的時間比上傳的時間還慢。

上傳量與所花時間:
1、上傳純文件數據,普通奔4,cpu是intel 350,512的內存,普通ide的硬盤,可以做20分鐘左右上傳7000萬行,每行20個字段左右(沒有二進制字段)。
2、大量上傳二進制字段,兩個雙核cup,2G內存,300G的SAS硬盤,快不起來了,不足15萬行,就要3個多小時(每個記錄包含兩上二進制字段,其中一個二進制字段的數據量為1兆左右,另一個為100K左右)。

回复
newqm 2007-12-01
帮顶
回复
winjay84 2007-11-30
1. 先插到一个空表t1中
2. 然后insert t2 select distinct col1 from t1
3. 再在t2上建主键

这样相对速度较快些。
但是,如果今后你还要继续在这个表t2的基础上插数据的话,还是避免不了速度越来越慢。
回复
中国风 2007-11-30
select top 10000 ID=identity(1,1) into # from syscolumns a ,syscolumns b,syscolumns c
-------
生成递增:
insert T(Col)
select 'ZT9928'+right(100000+ID,4)+'CN' from #
回复
w2jc 2007-11-30
有没有什么好的办法或者思路哪?
----------------------------------
考虑能否不要建主键,先插入,再建索引
(但是检查唯一性就比较麻烦...)
回复
hchack 2007-11-29
有没有什么好的办法或者思路哪?
回复
sgmao 2007-11-28
附上代码,执行了一下很快,不过没插入到数据库

declare @i int
declare @t_id varchar(20)
declare @temp table(t_id varchar(20))

set @i=1
while @i<=10000
begin
set @t_id=right('00000'+convert(varchar(5),@i),5)
set @t_id='ZT9928'+@t_id+'CN'
insert @temp(t_id) values (@t_id)
set @i=@i+1
end

select * from @temp
回复
kk19840210 2007-11-28
设置成了主键

你设置了主键,主键也是一个聚集唯一索引在你插入数据时 因为唯一的 所以会判断数据的唯一性,还有是聚集的会调整索引页里面记录的位置与更改物理数据的位置
所以越插入越慢
回复
sgmao 2007-11-28
先插入到到临时表,再保存到表里面速度应该影响会小点
回复
dawugui 2007-11-28
数据库为空,插入1万条记录需要40s,如果再次插入,那就需要1分多钟,如果再多次插入,那时间就成倍的增长了

由于要判断是否重复和重建索引,索引时间越来越长,应该没什么办法.
回复
发动态
发帖子
MS-SQL Server
创建于2007-09-28

3.2w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
社区公告
暂无公告