日期:2014-05-17  浏览次数:20512 次

如何快速插入上亿条记录
insert into t2
(id,c2,c3)
select 
(id,c2,c3)
from t

SQL语句简单, 但此表(t) 非常庞大, 记录条数是2亿多条, 查看这个表的大小有七十多个GB。

试着一次性插入, 结果导致了 tempdb 的被爆满, 提示空间不够(tempdb目前大小10GB左右)。 
不过其它几千万数据的插入, 不出错也是并不快, 22534250条的数据插入也执行了20062秒。

后来写了个存储过程, 分批插入, 每次插入1百万条左右。 速度还可以吧。

看看网上的介绍, Orcle 有分批插入的功能, 有点好奇地问问:
SQL Server 有没有类似的功能, 或者说简单点的办法来实现呢?

快速插入?sqlserver

------解决方案--------------------
用bcp命令
------解决方案--------------------
2亿的记录,不是小数据量了。分批次,每次几十万笔
若无特殊需求,将日志设为SIMPLE
------解决方案--------------------
表要做分区,然后才有“可能”并行插入,如果你要借助tempdb,那它的大小和IO要满足要求。尽量减少文件因大小不足而增长,如果T和T2都做了分区,那用switch分区切换,听说可以秒杀百万级别的数据,不过具体还是要测试。
------解决方案--------------------
--#1.手工处理:BCP导出,然后再BCP导入。
--#2.快照复制:如果是一次性的,建议用快照复制,做一下同步即可。
------解决方案--------------------
同数据库,每10万或百万执行一次,应该是最快的了,日志设为简单
因为慢在日志文件的生成上
------解决方案--------------------
在表已经存在的情况下,构建分区表,通过删除主键约束,重建主键约束,同时按照分区架构来建立聚集索引。当然,如果表本来就没有主键,只有一个聚集索引,那么可以直接删除聚集索引,然后在重建聚集索引时指定分区架构,其实就是索引分区,只不过这个索引里存储的是真正的表的数据。

链接: http://blog.csdn.net/yupeigu/article/details/7754115

代码:


--1.创建数据库
create database wc
on primary
(
name = wc_data,
filename = 'D:\wc_data.mdf'
)
log on
(
name = wc_log1,
filename = 'd:\wc_log1.ldf'  
),
(
name = wc_log2,
filename = 'd:\wc_log2.ldf'
)


--2.增加文件组
alter database wc
add filegroup wc_fg1

alter database wc
add filegroup wc_fg2

alter database wc
add filegroup wc_fg3

alter database wc
add filegroup wc_fg4

--3.把文件添加到文件组中
alter database wc
add file
(
name = wc_fg1_1,
filename = 'd:\wc_fg1_1.ndf',