如何分解/运行大型SQL查询?

时间:2010-07-19 08:27:47

标签: c# sql-server performance

我有一个包含大量行(约2亿)的表,我希望在从内存中读取这些值之后在c#中处理这些值。处理需要按照在sql server本身内部无法完成的方式按列值对条目进行分组。问题是一次读取整个数据会给我一个OutOfMemory异常,并且需要花费大量时间才能执行。

所以我想把我的查询分成更短的部分。一种方法是显然进行独立选择,然后使用where in子句。我建议的另一种方法是使用sql游标。我想选择其中一种方法(或者如果可能的话另外一种方法),特别是关于以下几点:

  1. 这些方案对服务器的性能影响是什么?哪个会表现得更快?
  2. 我可以安全地并行化sql游标查询吗?如果我并行化第一个方案(一个带where where子句),我会获得性能优势吗?
  3. 我可以在where子句中指定多少个对象?它是否仅受查询字符串大小的限制?
  4. 欢迎任何其他建议。

    Edit1:我得到了不同的解决方案,但我仍然想知道原始问题的答案(出于好奇心)。

2 个答案:

答案 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

它应该适用于你想要做的事情,并且比你列出的两个更好。