首页 新闻 会员 周边 捐助

关于数据库以及系统运行速度的问题

0
悬赏园豆:30 [已解决问题] 解决于 2013-08-06 16:47

我将一个excel的表格导入成gridview后,想将其再次导入到数据库中。

可是我想数据库中如果有这个excel里的数据的话(不是全部)。那么我就对其进行更新而不是插入。这里就有一个问题。加入我导入的excel表中有几万条数据,而数据库中也有几万条数据,那么我Gridview(导入excel表后)里每行都得与数据库里的几万条数据对比看是否有相同,再决定是插入还是更新。那么几万乘以几万次,这样的话会不会使这个系统的处理速度很慢(或者说完成操作都得十几分钟),有什么方法能对其进行优化,或者技术能对其进行有选择的对比而不是每个都对比一次。

请对这方面有经验或者做过类似的程序员帮帮忙。。。

回望未来的主页 回望未来 | 初学一级 | 园豆:4
提问于:2013-07-30 12:21
< >
分享
最佳答案
1

正常应该是 先把数据库对比的键值 一次性缓存下来,然后EXCEL的键值与之对比,构建insert或update,最后一次更新数据库

收获园豆:20
Yu | 专家六级 |园豆:12990 | 2013-07-30 13:09

将其进行一次性缓存,那么该怎么做。我是新手,没接触过这方面的内容。能改个例子我模仿下吗。。。。。。。

回望未来 | 园豆:4 (初学一级) | 2013-07-30 20:36

@回望未来: 你试试

//要比较的键值在 select new {....} 中
var
products = (from c in context.Products select new { c.ID,c.Name }).ToList();// 一次性加载
//这里换成你的EXCEL数据集合
var stuffs = new List<Stuff> { new Stuff { name = "CCC1" }, new Stuff { name = "BBB1" } }; foreach (var s in stuffs) { var o=products.Where(n => n.Name == s.name);//不会再查数据库 if (o.Count(n => n.Name == s.name)==0) { //insert context.Products.Add(new NS.Models.Product { ID=Guid.NewGuid(), Name=s.name}); } else { //update NS.Models.Product update=new NS.Models.Product(); update.ID = o.FirstOrDefault().ID;//必须设置 update.Name=s.name; update.Count = 3; var e=context.Entry(update); if (e.State == System.Data.EntityState.Detached) { e.State = System.Data.EntityState.Modified; } } } context.SaveChanges(); //最后一次性更新
Yu | 园豆:12990 (专家六级) | 2013-07-31 09:50
其他回答(6)
0

一般的做法,先删除,在ADD,别去判断更新了~~

 

如果你真要判断,那么就先针对统一字段排序,这样能够减少比较次数~

幻天芒 | 园豆:37207 (高人七级) | 2013-07-30 13:01
0

你先把数据库里的对比的键值用一个hash存起来,这个过程是O(n)复杂度,再把你要add 或update的数据的进行对比,这边的复杂度是O(m),这样的一个操作过程的复杂度最低只能做到O(M+N),只要不做成O(M*N)的复杂度就可以了,时间慢的应该是装箱拆箱的过程,用多线程来做吧,因为整个执行的时间比较,为了怕出现问题断电,误断的问题导致重新对比操作,最好用消息队列来做。

野火烧不尽 | 园豆:225 (菜鸟二级) | 2013-07-30 17:19
0

where里的条件先选取较少出现的字段做对比,那下一个条件就会在上一个前提下寻找数据,只要上一个筛选出的数据少,那么速度就会快了,例如:汉族,维吾尔族,

雾里小梅花 | 园豆:137 (初学一级) | 2013-07-30 21:55
0

一般的处理方式是先删除后重新插入。整个过程用事务控制,以保证安全。

panjk | 园豆:712 (小虾三级) | 2013-07-31 09:25
0

傻孩子,不管3721导入后,在数据库sql完成去重复操作

收获园豆:5
[秦时明月] | 园豆:738 (小虾三级) | 2013-07-31 11:55
0

最好的解决办法是,直接将新的EXCLE插入到库中的一个新表

然后触发一个操作,将新表和旧表关联进行UPDATE

关联不到的直接进行插入

就完成了.效率杠杠滴

收获园豆:5
dearz | 园豆:588 (小虾三级) | 2013-08-01 17:42
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册