counter
counter

SQL 插入数据太慢的问题

1.转http://zhidao.baidu.com/question/328967258.html

建分区表的话, 要看你有几个磁盘.
如果只有一个磁盘的, 分区来分区去, 最后数据还是在 一个磁盘上面,

如果你有多个磁盘的.
那么可以根据那个 自增 ID , 设置一个 计算列
比如你有5个 磁盘, 那么 那个计算列 是 自增 ID % 5
那么 当 计算列的数值 = 1 , 数据被存储到 磁盘1上面
那么 当 计算列的数值 = 2 , 数据被存储到 磁盘2上面
那么 当 计算列的数值 = 3 , 数据被存储到 磁盘3上面
那么 当 计算列的数值 = 4 , 数据被存储到 磁盘4上面
那么 当 计算列的数值 = 0 , 数据被存储到 磁盘5上面

这种情况,是针对 你插入数据量很大, 瓶颈发生在 磁盘 IO 处理的情况下。
可以提升一定的 插入的性能。

但是看你的那个描述
当记录数据到达1000w之後插入记录就变得很慢
那么我怀疑,可能是 索引处理 花费的时间比较多了
因为你插入一行数据
要更新 表的数据, 同时还有 更新索引的数据
表的数据,更新起来很简单。 索引的更新,需要做一定的计算。
即时你的表,没有任何的索引,但是那个 自增主键, 也是自动要创建索引的。
2.全表扫描,无法利用表上的索引。
3.先看磁盘io情况,然后再检查下碎片情况,再看看无用的索引删删掉,insert的效率就会上来了。
4.转:http://hi.baidu.com/szarticle/item/99a41f443ad81931fb896041
搞定大量数据插入SQL SERVER,测试最快可达1万(日志设为简单)

终于搞定了中继的数据采集,本以为一天搞定的事情,足足让我搞了3天有余,部分时间是被其他事情耽搁了,主要原因是以前使用的插入数据库数据的方式有问题。

之前,按照一个大哥的说法,使用存储过程操作数据表,可能会防止数据表死锁的问题,所以,所有的数据操作全部封装为存储过程来进行处理,包括:数据对象的insert操作,小数量数据的时候,也没有多大感觉,但是现在插入的中继信息居然达到了300万的数量,按照原来的方法,每秒大概只能插入200数据,总用时15000秒,我靠,半天时间玩完了,多线程插入也没用,速度差不对。

无解,只能想办法提高采集速度,先把程序处理逻辑进行调整,还是没有多大提高,毕竟数据插入太慢了,只得想办法提高数据插入的操作,经过了解发现原因是,每次存储过程会自动完成一个事务操作,而每个事物要进行日志的写入,估计还有效验等工作,简单的做法就是将多个插入SQL语句组合在一个数据中,减少对日志的操作,发现效率提高的不错,基本能达到1800条每秒。

具体做法:

1.如果不是必须,把数据库的恢复模式改为“简单”

2.使用如下的方式插入数据:最好直接作为一条SQL语句直接执行,但是不要写太多条进去,貌似有人说大于1000了,应该有慢下来的,我每次插入20性能已经相当不错,所以就先这样把任务完成先,以后再研究最好的方法。

BEGIN TRANSACTION
INSERT …
INSERT …
INSERT …
COMMIT TRANSACTION

具体实现方法比较:

  1. 将一次要提交的SQL语句,无论多少条Insert全部组合成为一条SQL语句,以BEGIN TRAN;开始,以COMMIT TRAN;结束。这样的操作速度最快可达1万/秒。
  2. 跟上面方法一致,但是每条SQL语句执行一次ExecSQL,第一次ExecSQL(‘BEGIN TRAN’),最后ExecSQL(‘Commit TRAN’),这样操作数据一般,性能提高微弱,目前我测试效率为1500条/秒左右。

 

posted @ 2013-04-08 13:49  bfy  阅读(7159)  评论(0编辑  收藏  举报