我有一个包含大量行(约2亿)的表,我希望在从内存中读取这些值之后在c#中处理这些值。处理需要按照在sql server本身内部无法完成的方式按列值对条目进行分组。问题是一次读取整个数据会给我一个OutOfMemory异常,并且需要花费大量时间才能执行。
所以我想把我的查询分成更短的部分。一种方法是显然进行独立选择,然后使用where in子句。我建议的另一种方法是使用sql游标。我想选择其中一种方法(或者如果可能的话另外一种方法),特别是关于以下几点:
欢迎任何其他建议。
Edit1:我得到了不同的解决方案,但我仍然想知道原始问题的答案(出于好奇心)。
答案 0 :(得分:1)
如果必须在代码中执行分组逻辑,可以尝试将逻辑编写为sql server中的托管存储过程,可以在groping查询中使用。
结帐
这样您就可以在将数据集返回给客户端之前对服务器进行分组。
[编辑 - 关于您对使用词典的评论]
您可以在Codeplex上查看我的项目,该项目的磁盘已保留Dictionary<T,V>
。这可以防止内存不足异常。看看它如何适用于您的场景会很有趣。 (如果您使用的是32位系统,请阅读介绍页面上的注释。)
答案 1 :(得分:1)
如果您使用的是sql 2005或更高版本,则应检查基于sql的分页。
http://blogs.x2line.com/al/archive/2005/11/18/1323.aspx
它应该适用于你想要做的事情,并且比你列出的两个更好。