数据库插入操作性能提升问题

damao
  • 423

程序简写为
while()
{
A:计算;
B:向数据库插入数据(PS.一般累加到1W条数据库的时候一起插入)
}
总共记录有700W+,耗时10个小时,如果去掉B,只进行计算,大概需要2分多钟;
之所以用数据库是因为这些结果数据需要被查询,但是瓶颈显然是在数据库插入操作,10个小时还是太慢了。
如果我想改进,有没有什么办法呢??
如果我将计算的数据写在文件里,同时开启100个线程进行写文件操作,是不是能快点呢?但是如果写在文件里面的话查询就费事了,可以用Lucene做查询吧?
——————————————————————————————————————————————————————————————————————————————
听下面几位讨论过后,感觉改进的地方在数据库优化这一块,700W+条数据大概也就3G吧,普通的复制操作的话几分钟就好了,但是insert into 插入操作怎么优化呢。。sqlserver2008数据库

回复
阅读 10.3k
5 个回答
qinjianxiang
  • 5.9k
✓ 已被采纳

答案:

  1. 先把所有索引都删除,待插入完毕,再重新建索引,它的意义是:插入时,只写数据,不写索引。全部插入完毕,你再创建索引,索引文件只需创建一次,而不是像你原来那样频繁更新700万次
  2. 把write buffer的值设置的大一点,它的意义是:lazy writer先写入内存,内存中积累一定的条数再同步到磁盘上,更大的write buffer可以让lazy writer在内存中积累更多的数据之后再写磁盘,减少磁盘写入次数
  3. (补充)【一般累加到1W条数据库的时候一起插入】,把这个优化规则去掉。留给SQL Server的Lazy Writer做就行了,它做这个比你专业,如果你碰巧用的是PHP、Ruby这种动态语言,就更应该交给SQL Server做了

我是这样理解你的问题:
1. 为什么要写入数据库,因为计算结果需要给人查询,所以不能放在文件里
2. 慢在哪里,计算只要2分钟,慢在数据库写入上
3. 计算只要2分钟,说明你的计算,不依赖上一步计算并写入数据库的数据。也就是说你的计算程序不需要查询你刚刚写入的数据

【写入文件】、【使用lucene专门做查询】的解决方案都太重量级了,700万也不是太大的数据,我上面的两条措施只是运维层面的改动,不需要修改你的程序,就可以把时间缩短到0.5-2小时。还有,才2分钟的计算量,也不用考虑分布式和并行计算。

除非你有 100 个硬盘,不然多线程同时写只会更慢(因为增加了硬盘操作中最耗时的部分——寻道)。
你的数据库配置和结构设计可能存在问题。

换块SSD可能是可行方案。。 话说大多数网站的瓶颈都是卡在SQL上吧0.0

  1. 700W+ 数据也不算多, 插入需要10个小时, 不说你的 程序有什么问题, 但是效率肯定是可以提高的.

  2. 一般 向数据库 导入导出, 数据库都会提供相应的工具. 比如mysql的:
    http://dev.mysql.com/doc/refman/5.1/en/load-data.html

先prepare一个insert statement,然后后面都用execute statement,比每次都insert快得多

宣传栏