一尘不染

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

sql

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

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

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

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


阅读 125

收藏
2021-03-17

共1个答案

一尘不染

这部分取决于查询本身是在流传输还是在临时表中 进行 大量工作, 然后
(最终)开始返回数据。在第二种情况下,除了重新编写查询之外,您无法做其他任何事情。但是,在第一种情况下,迭代器块通常会有所帮助,即

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-SQLExecuteQuery<T>(tsql,args)可以轻松完成上述任务。

2021-03-17