大量数据求解决方案

dafafdaasf 2012-10-21 03:16:24
有一个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 多万条数据,怕有性能问题。求解决方案

...全文
163 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
SocketUpEx 2012-10-21
  • 打赏
  • 举报
回复
其实,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;

dafafdaasf 2012-10-21
  • 打赏
  • 举报
回复
int 型 ,压力应该是不大的吧
niss 2012-10-21
  • 打赏
  • 举报
回复
datareader是只向前的,不会对内存造成压力
dafafdaasf 2012-10-21
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

分页、DataSet等方法都是不太合适的方式,正确的方式是使用DataReader,一边读取,一边写入。
[/Quote]

主要考虑的还是 占用内存大吗?
niss 2012-10-21
  • 打赏
  • 举报
回复
datareader好
dafafdaasf 2012-10-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

600多分页导出到XCEL,XML等,再处理
[/Quote]

分成 600页 导入到 XCEL,XML?
bluedoctor 2012-10-21
  • 打赏
  • 举报
回复
分页、DataSet等方法都是不太合适的方式,正确的方式是使用DataReader,一边读取,一边写入。
wuyq11 2012-10-21
  • 打赏
  • 举报
回复
600多分页导出到XCEL,XML等,再处理
dafafdaasf 2012-10-21
  • 打赏
  • 举报
回复
自己顶
MoXiaoRab 2012-10-21
  • 打赏
  • 举报
回复
600多万???我怎么觉得像某次事件之后CSDN的数据库??
dafafdaasf 2012-10-21
  • 打赏
  • 举报
回复
建临时表应该是不行的。 , 针对这种情况,如果用分页的话,具体的一些细节
showjim 2012-10-21
  • 打赏
  • 举报
回复
如果这种查询的频率比较高的话,应该在修改Order的时候同步更新那个临时表(就不应该是临时表了)
showjim 2012-10-21
  • 打赏
  • 举报
回复
如果Order.orderid不一定存在对应的info.orderid,可以考虑在另一台数据库服务器上建立一个临时表,把Order.orderid在内存排序后导过去(100Mb网卡+普通硬盘600W个int应该不到10s),然后再做关连查询。
dafafdaasf 2012-10-21
  • 打赏
  • 举报
回复
是的 ,不一定的 。
showjim 2012-10-21
  • 打赏
  • 举报
回复
你的意思是Order.orderid不一定存在info.orderid?否则,直接取info.level==2的不就行了吗?
dafafdaasf 2012-10-21
  • 打赏
  • 举报
回复
int 型,内存应该是够的 ,放到 list<>里好,还是datatable 里好
showjim 2012-10-21
  • 打赏
  • 举报
回复
常驻内存的话,关键是内存够不够的问题,不过内存还是算便宜的
dafafdaasf 2012-10-21
  • 打赏
  • 举报
回复
分页处理的话,那我需要获得所有的页数n, 然后写个 for 循环 , i=0 ; i< n ,i++ ,在这个循环里处理,这样子好吗
bdmh 2012-10-21
  • 打赏
  • 举报
回复
一次性全读下来,估计太慢,你分页处理,或者按某种条件查询处理

110,533

社区成员

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

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

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