当前位置:编程学习 > C#/ASP.NET >>

大量数据求解决方案

 有一个Order 表 ,三个主要的字段是 id(int)   orderid(int)  remank(varchar)。 id 是主键,自增的,orderid 也是不重复的,大概有600多万条数据。另一台数据库服务器上的 info 表,主要的字段 有orderid(int) 和 level(int),其中orderid 和order 表的 orderid 是对应的。  
      要求根据order表上的orderid 从info表上查询,如果 info表上某条记录的level等于2,那么就更新order表上相同orderid 记录的remark 字段。因为 两个表在两个不同的数据库服务器上,公司不允许用link server ,所以整个需求不能用存储过程。要求将order表的所有orderid  加载到程序服务器上的内存里,如放到datatable 里,   然后从datatable 里取orderid ,再根据这些orderid从info表上查信息,然后再更新。
      因为有600 多万条数据,怕有性能问题。求解决方案
      
      --------------------编程问答-------------------- 一次性全读下来,估计太慢,你分页处理,或者按某种条件查询处理 --------------------编程问答-------------------- 分页处理的话,那我需要获得所有的页数n, 然后写个 for 循环 , i=0 ; i< n ,i++ ,在这个循环里处理,这样子好吗  --------------------编程问答-------------------- 常驻内存的话,关键是内存够不够的问题,不过内存还是算便宜的 --------------------编程问答-------------------- int 型,内存应该是够的 ,放到 list<>里好,还是datatable 里好 --------------------编程问答-------------------- 你的意思是Order.orderid不一定存在info.orderid?否则,直接取info.level==2的不就行了吗? --------------------编程问答-------------------- 是的 ,不一定的 。 --------------------编程问答-------------------- 如果Order.orderid不一定存在对应的info.orderid,可以考虑在另一台数据库服务器上建立一个临时表,把Order.orderid在内存排序后导过去(100Mb网卡+普通硬盘600W个int应该不到10s),然后再做关连查询。 --------------------编程问答-------------------- 如果这种查询的频率比较高的话,应该在修改Order的时候同步更新那个临时表(就不应该是临时表了) --------------------编程问答-------------------- 建临时表应该是不行的。 , 针对这种情况,如果用分页的话,具体的一些细节 --------------------编程问答-------------------- 600多万???我怎么觉得像某次事件之后CSDN的数据库?? --------------------编程问答-------------------- 自己顶 --------------------编程问答-------------------- 600多分页导出到XCEL,XML等,再处理
--------------------编程问答-------------------- 分页、DataSet等方法都是不太合适的方式,正确的方式是使用DataReader,一边读取,一边写入。 --------------------编程问答--------------------
引用 12 楼  的回复:
600多分页导出到XCEL,XML等,再处理


分成 600页 导入到 XCEL,XML? --------------------编程问答-------------------- datareader好 --------------------编程问答--------------------
引用 13 楼  的回复:
分页、DataSet等方法都是不太合适的方式,正确的方式是使用DataReader,一边读取,一边写入。


主要考虑的还是 占用内存大吗? --------------------编程问答-------------------- datareader是只向前的,不会对内存造成压力 --------------------编程问答-------------------- int  型 ,压力应该是不大的吧   --------------------编程问答-------------------- 其实,600W条记录,加载到内存也没多大的,主要看remank的容量
id(int) orderid(int) remank(varchar)
三个字段,id是不需要加载到内存的
_DicOrder = new Dictionary<Int32, String>(6000000);
就行了
试试用多少内存吧

另外,如果remank有大量重复的内容,还可以这样设计
private Dictionary<String, Int32> _DicRemank;
private Dictionary<Int32, Int32> _DicOrder;

补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,