C# 关于数据库存储的问题

危楼望月 2015-12-22 02:29:53
大神们,是这样,有几十万的数据,需要每天要不断检查更新。这几十万数据获取的时候很快,每次存储之前程序都会查一下看看是不是在数据库里已经有了,如果没有就增加,有就更新。但是效率太低了,占用时间太久了,有没有什么办法让这个过程变得快一些?是用多线程?还是用数据库事务?还是有别的办法?
求思路和例子!
...全文
207 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
危楼望月 2015-12-24
  • 打赏
  • 举报
回复
引用 9 楼 yenange 的回复:
[quote=引用 7 楼 chensong3140617 的回复:] 利用索引能够提高读取的速度,也能提高修改 新增的速度?设置表的时候有索引
你根本不明白你慢在哪里, P哥说的是对的。 我的建议: 1. 创建一个临时的普通表(如: dbo.tmp_importData )将几十万数据用 SqlBulkCopy 插入到 tmp_importData 表; 2. 写一个存储过程, 在存储过程里完成判断和插入。 你原来的做法, 有很大一部分是因为.net和数据库要多次交互, 浪费了时间。 其次, 判断是否应插入, 需要合适的索引, 如果你们公司有DBA的话应该请假他们索引是否合适。 用我的做法, 大概 30秒到1分钟可以完成。[/quote] 没有公司,自己一个人搞的,只是网上看过视频教程,讲的都是很基础的知识。谢谢你的思路,我网上搜搜例子。
SimonYCJ 2015-12-22
  • 打赏
  • 举报
回复
各位都说的很好,个人小小的建议,你这种情况可以使用内存数据库比如Mongodb,然后等后台数据库利用率下来的时候,再开始把Mongodb的数据合并到真实的后台数据库。
危楼望月 2015-12-22
  • 打赏
  • 举报
回复
利用索引能够提高读取的速度,也能提高修改 新增的速度?设置表的时候有索引
xuzuning 2015-12-22
  • 打赏
  • 举报
回复
如果没有就增加,有就更新 这是 replace 指令完成的工作,只要你对关键列做好唯一索引
危楼望月 2015-12-22
  • 打赏
  • 举报
回复
引用 4 楼 sp1234 的回复:
调用存储过程,还是直接了当地发送sql语句,这只是“编程体验”问题。对你的应用程序执行效率,根本不会有什么差别。凡是动不动就说“使用存储过程就能感觉到程序变快”的,基本上都是“屌丝”,而不是客观的程序员了。因为它顶多是只能把你原本用3个小时的过程,提高到2小时59分钟30秒,而已,基本上还是多次执行时并不能保证总能够快30秒钟(说不定还会慢30秒钟)。 而利用上索引,则是把3小时的过程,变成到5分钟完成。这才是真正的程序员该做的事情。
现在是有5张表需要更新,获取的json数据,解析之后的model里含有5张表的数据,有4张表是list<T>的数据,先判断是不是null,然后再循环 检查是新增 还是修改。感觉挺慢的,更新400多条数据要7分钟,1秒1条...
  • 打赏
  • 举报
回复
调用存储过程,还是直接了当地发送sql语句,这只是“编程体验”问题。对你的应用程序执行效率,根本不会有什么差别。凡是动不动就说“使用存储过程就能感觉到程序变快”的,基本上都是“屌丝”,而不是客观的程序员了。因为它顶多是只能把你原本用3个小时的过程,提高到2小时59分钟30秒,而已,基本上还是多次执行时并不能保证总能够快30秒钟(说不定还会慢30秒钟)。 而利用上索引,则是把3小时的过程,变成到5分钟完成。这才是真正的程序员该做的事情。
  • 打赏
  • 举报
回复
所谓“多线程”,应该只会让它插入得更慢,而不是更快。 所谓“事务”,实际上就算你不显式(在应用程序侧的代码中)使用事务,那么你发出的sql语句本身也会由数据库服务器去每条都启动事务。 无关的概念堆砌起来,解决不了问题。因此也不要死记硬背什么“答案”,关键是要搞明白为什么。
  • 打赏
  • 举报
回复
跟你说的都没有关系。就是基本的数据库知识——建立并且确保使用索引。
BobHe 2015-12-22
  • 打赏
  • 举报
回复
使用数据库存储过程吧
吉普赛的歌 2015-12-22
  • 打赏
  • 举报
回复
引用 7 楼 chensong3140617 的回复:
利用索引能够提高读取的速度,也能提高修改 新增的速度?设置表的时候有索引
你根本不明白你慢在哪里, P哥说的是对的。 我的建议: 1. 创建一个临时的普通表(如: dbo.tmp_importData )将几十万数据用 SqlBulkCopy 插入到 tmp_importData 表; 2. 写一个存储过程, 在存储过程里完成判断和插入。 你原来的做法, 有很大一部分是因为.net和数据库要多次交互, 浪费了时间。 其次, 判断是否应插入, 需要合适的索引, 如果你们公司有DBA的话应该请假他们索引是否合适。 用我的做法, 大概 30秒到1分钟可以完成。

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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