以下内容 摘自此贴 http://topic.csdn.net/t/20050605/11/4060295.html
开发的项目中要插入大量的数据到数据库中,差不多每秒8000条记录以上.共有4个字段,每条记录不超过300字节.
以前的系统是在linux下实现的,用的mysql数据库,普通的insert语句,每秒可以插入10000条记录左右.
可我使用sql server在win2003下,用普通的insert每秒只能插入大概1000条记录左右.
难道sql server的性能有问题么?如何能提高这个插入性能.使用存储过程性能好像也差不多.
请问:这个问题的性能瓶颈在哪里?是否有方法能提高insert的性能??
我自己做的测试:如果使用批量事务处理,同时用一个事务处理10000条记录用时大概1秒左右.用bcp差不多也是每秒10000条左右记录的样子.性能提高很明显.可我不太想实现成这种模式.
是否有方法能提高数据插入速度到每秒10000条左右?? 我同事在linux下的mysql可以轻松用普通的insert实现.这点让我很不爽啊.
|
#1楼 得分:0回复于:2005-06-05 12:19:00
sql server事务处理机制的问题(mysql不存在这个问题).
对于每条insert,sql server都要开启一个事务(内部的自动事务),用以保证数据处理的一致性和原子性.
所以你如果是每条记录都insert一次的话,对于sql server来说,它的效率是很低的.
因此在sql server中处理应该使用批量提交数据(存储过程和单条insert是差不多的),或者使用bcp
|
|
|
|
|
#2楼 得分:30回复于:2005-06-05 12:21:31
各种数据库处理机制不一样,处理数据的时候,应该针对不同的数据库采用不同的处理方法,而不要先固定方法,再找解决办法.
|
|
|
|
原来我也是这么理解的,但不敢确定. mysql为什么不存在这种机制呢?奇怪阿.
我以为我在sql server的优化上还有没考虑周全..
是否有方法能屏蔽内部的这种事务机制呢?
|
|
|
|
|
#4楼 得分:0回复于:2005-06-06 10:53:54
|
|
|
#5楼 得分:70回复于:2005-06-06 11:52:24
mysql也会有隐式transaction的性能损耗, 我怀疑是你的索引的问题,如果你的索引的填充因子比较合适,能够插入的同时很少调整重构磁盘上的B-树,那么你的性能就会比较高,或者把clustered index改成non-clustered看看,这样也可以改善大量插入的性能,不过牺牲了读操作。还可能是硬件幻境的差异,比如磁盘io和网络。
> > 是否有方法能屏蔽内部的这种事务机制呢? 这种内部implict事务是不可屏蔽的(这个你需要有控制b-tree上latch的能力吧?或许用lock hint可以,但是就算可以我也不认为这样的牺牲值的)
另外,很多人都说mySql是小型应用中最快的数据库,也有可能哦。
|
|
|
|
|
#6楼 得分:0回复于:2005-06-07 10:44:56
god! to 楼上的,我还没建索引呢,已经这样了,不过非常感谢你的帮助. 虽然我还不是太清楚什么是磁盘上的B-tree. :)
非常感谢!
|
|