数据条数太多,插入到数据库有延迟,怎么解决?

2014-05-09 09:14:47
用ASHX页面接收客户端收到的JSON 字符串然后做解析后返回确认值。
由于JSON 字符串里面有很多条目,所以一个客户端的数据会插入数据N条数据。

代码基本是这样的


----解析JSON成array类型
for i=1 to arraylist.number
{
---insert into database
----cmd.ExecuteNonQuery();

}
---返回客户端表示确认已经收到


现在的问题是客户端接收到返回值超级慢,经过排查排除IIS,CPU,内存,网络,程序问题和数据连接问题。
当注释掉cmd.ExecuteNonQuery();这句话的时候返回值很快,说明在数据库插入的时候出现问题。有个现象,当注释掉cmd.ExecuteNonQuery()的时候在看数据插入的数据表,竟然过了30,40秒还陆陆续续有数据进来,说明之前的数据一直都在SQLserver缓冲里面排队等待插入


插入的数据表就5列,其中一个自增列,一个接收的时间作为索引,其他是数据信息,去掉索引后问题依旧。用自增ID可以大概监测到每秒会有1000条数据进来。

基本可以肯定是客户端数量太多,客户端发一条json数据过来,我这边解析后都会有N条数据需要插入,同时需要即时返回“已经收到”给客户端。


有网友说把收到的一批数据先缓存到dataset,我认为实际上跟现在是一样的,都是要循环一条条插入,本质上是由于硬盘读入瓶颈造成。

有什么方法可以让数据插入到数据表更快些?多建几个相同的表,然后再插入前随机分配到插入数据表有用吗 ?或者说用SSD?








...全文
694 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
chai1338 2014-05-10
  • 打赏
  • 举报
回复
SqlBulkCopy批量插入
zouchunhui 2014-05-10
  • 打赏
  • 举报
回复
使用事务。然后生成批量的脚本,一次性插入。会很快的。再建好相应的索引。
bwangel 2014-05-10
  • 打赏
  • 举报
回复
如果仅仅是日后要用到的留痕数据,可以用个缓存队列,数据先缓存起来。然后后台开个线程去慢慢写。这样前台的线程就不会阻塞。
  • 打赏
  • 举报
回复
“有个现象,当注释掉cmd.ExecuteNonQuery()的时候在看数据插入的数据表,竟然过了30,40秒还陆陆续续有数据进来,” 不太懂你这句话是什么一地。既然都注释掉了执行语句,怎么还会改变数据库? 如果有,只能说明你的 sql 代码中有太多的不合理的“锁”。你应该对大量的查询(而非修改)操作的数据库事务级别降低,或者写上类似 with (nolock) 这样的关键字!
  • 打赏
  • 举报
回复
再for循环前开启事务,然后再一条条插入数据,最后统一提交事务。 如果你不开启事务,SQL Server会默认地为每一条都创建一个独立的事务。这很不值得。
2014-05-09
  • 打赏
  • 举报
回复
引用 1 楼 insus 的回复:
不必一条一条Insert到数据库。 可以考虑下面的方法: http://www.cnblogs.com/insus/archive/2012/09/22/2698515.html
在循环前用Connection.BeginTransaction() 循环后用Tran.Commit();有用吗 我在SQL 查询分析器里面写N条insert语句在前后加入BeginTransaction 和commit 要比直接插入快10倍以上。。
2014-05-09
  • 打赏
  • 举报
回复
引用 1 楼 insus 的回复:
不必一条一条Insert到数据库。 可以考虑下面的方法: http://www.cnblogs.com/insus/archive/2012/09/22/2698515.html
这样插入会比一条一条的快多少呢 ? 跟其他的批量插入有什么优势呢?
insus 2014-05-09
  • 打赏
  • 举报
回复
不必一条一条Insert到数据库。 可以考虑下面的方法: http://www.cnblogs.com/insus/archive/2012/09/22/2698515.html

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧