c# - 处理大型 SQL 选择查询/分块读取 SQL 数据

标签 c# sql optimization chunking

我使用的是 .Net 4.0 和 SQL Server 2008 R2。

我正在运行一个大型 SQL 选择查询,该查询返回数百万个结果并且需要很长时间才能完全运行。

有谁知道我怎样才能只读取查询返回的部分结果而不必等待整个查询完成?

换句话说,我想在查询仍在运行时读取第一个 10,000 条记录 block 并获得下一个结果。

最佳答案

这部分取决于查询本身是否在流式传输,或者它是否在临时表中做了很多工作然后(最终)开始返回数据。除了重写查询之外,在第二种情况下你不能做太多事情;然而,在第一种情况下,迭代器 block 通常会有所帮助,即

public IEnumerable<Foo> GetData() {
     // not shown; building command etc
     using(var reader = cmd.ExecuteReader()) {
         while(reader.Read()) {
             Foo foo = // not shown; materialize Foo from reader
             yield return foo;
         }
     }
}

现在这是一个流式迭代器 - 你可以 foreach通过它,它将从传入的 TDS 数据中实时检索记录,而无需先缓冲所有数据。

如果您(也许是明智的)不想编写自己的具体化代码,可以使用一些工具为您完成这项工作 - 例如,LINQ-to-SQL 的 ExecuteQuery<T>(tsql, args)将无痛地进行上述操作。

关于c# - 处理大型 SQL 选择查询/分块读取 SQL 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5726551/

相关文章:

c++ - 是否允许编译器优化堆内存分配?

c++ - 防止基准测试的空语句优化

c# - 没有 Entity Framework 的存储库

c# - Blazor [WASM] System.TypeLoadException : Could not resolve type with token 0100001a

php - sql连接需要进一步的帮助

php - 获取列总和的SQL

mysql - 从单个表中选择两个用户之间的所有共同项目

c# - Windows Phone 7 下载版本

c# - 在所有解决方案项目中共享域模型对象

c++ - move 语义和临时隐式 this