处理大型SQL select查询/读取块中的sql数据

Omr*_*mri 9 c# sql optimization chunking

我正在使用.Net 4.0和SQL Server 2008 R2.

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

有谁知道如何只读取查询返回的一些结果而不必等待整个查询完成?

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

Mar*_*ell 12

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

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;
         }
     }
}
Run Code Online (Sandbox Code Playgroud)

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

如果您(可能明智地)不想编写自己的实现代码,那么有一些工具可以为您执行此操作 - 例如,LINQ-to-SQL ExecuteQuery<T>(tsql, args)将完成上述无痛操作.