返回信息流请教一下,sql server如何快速插入一百万条数据,表结构很简单,因为是要测试性能用的,
id, name, age
直接用while+insert效率非常低,应该是因为每一次insert都是一次事务导致的吧,感觉做数据库性能优化的应该经常遇到这样的问题才是,不知道有没有人有好的办法?
这是一条镜像帖。来源:北邮人论坛 / database / #3933同步于 2009/10/26
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Database机器人发帖
如何快速插入一百万条数据
Keyman
2009/10/26镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
SQL SERVER 支持一句 INSERT 插入多行数据么?
MySQL 是可以的
【 在 Keyman (KISS) 的大作中提到: 】
: 请教一下,sql server如何快速插入一百万条数据,表结构很简单,因为是要测试性能用的,
: id, name, age
: 直接用while+insert效率非常低,应该是因为每一次insert都是一次事务导致的吧,感觉做数据库性能优化的应该经常遇到这样的问题才是,不知道有没有人有好的办法?
: ...................
【 在 Wing 的大作中提到: 】
: 事务不是可以自己开始,自己提交么?
隐式事务,自己开始自己提交那个是显示事务。
sql server貌似不支持一次多行
【 在 dragon2000 的大作中提到: 】
: 已知的数据库之中,最快的插入大批数据的方法应该都是load data。
恩,sql server有个bulkinsert,适合大批量插入数据,但是他得有个数据源,sql能先把数据写入某个文件然后再用这个bulkinsert导入吗?
哈,自己想到一个很有意思的办法,类似使用二分法进行搜索一样的原理。
我的思路就是,想往数据库中插入一条记录,然后使用insert into tableA select * from tableA这样的方式来插入,这样一次就可以插入上一次插入的数目。第一次插入1条,接下来分别插入2,4,8,16,32,64,128,。。。。
很快就到100万了,使用这样的方式插入100万条数据还不到4秒(服务器配置)。
为了生成尽可能随机的数据,我后面在select from tableA的时候对各个字段做了一些处理
create table #tmp
(
id int,
name varchar(64),
age int
)
set nocount on
insert into #tmp values(1,'ceshi',20)
declare @max int = 1
while @max < 1000000
begin
insert into #tmp select id+@max,convert(varchar,RAND(20)*1000000),convert(int,RAND()*100) from #tmp
set @max = @max * 2
end
select COUNT(*) from #tmp
做的处理实际上比较简单,首先id要连续增长,所以每次都要加上上一次插入之后的id最大值,age就是个100以内的随机正整数,name是个随机正整数。实际应用可以替换成函数。
而使用while一条一条插入的话,时间为35秒(服务器配置)
create table #tmp
(
id int,
name varchar(64),
age int
)
set nocount on
declare @i int = 1
while @i < 1000000
begin
insert into #tmp values( @i,convert(varchar,RAND(20)*1000000),convert(int,RAND()*100))
set @i = @i + 1
end
select COUNT(*) from #tmp
drop table #tmp
【 在 Keyman 的大作中提到: 】
: 哈,自己想到一个很有意思的办法,类似使用二分法进行搜索一样的原理。
: 我的思路就是,想往数据库中插入一条记录,然后使用insert into tableA select * from tableA这样的方式来插入,这样一次就可以插入上一次插入的数目。第一次插入1条,接下来分别插入2,4,8,16,32,64,128,。。。。
: 很快就到100万了,使用这样的方式插入100万条数据还不到4秒(服务器配置)。
: ...................
如果一百万条数据要求服从某个概率分布呢。你这个方法怎么办?