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

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

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

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

任何其他建议也欢迎.

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

最佳答案 如果必须在代码中执行分组逻辑,则可以尝试将逻辑编写为sql server中的托管存储过程,该过程可以在groping查询中使用.

查看

> How to: Create and Run a SQL Server
Stored Procedure by using Common
Language Run-time Integration

> How to: Create and Run a SQL Server
User-Defined Function by using Common
Language Run-time Integration

这将允许您在将数据集返回到客户端之前在服务器上进行分组.

[编辑 – 关于您对使用词典的评论]

您可以在Codeplex查看我的项目,该项目有一个磁盘持久字典< T,V>.这可以防止内存不足异常.看看它如何适用于您的场景会很有趣. (如果您使用的是32位系统,请阅读介绍页面上的注释).

点赞