处理大的SQL选择查询/读取大块中的sql数据

|| 我正在使用.Net 4.0和SQL Server 2008 R2。 我正在运行一个大型SQL选择查询,该查询返回数百万个结果,并且需要很长时间才能完全运行。 有谁知道如何只读取查询返回的一些结果,而不必等待整个查询完成? 换句话说,我想在查询仍然运行并读取下一个结果的同时读取第一个10,000条记录块。
已邀请:
这部分取决于查询本身是在流传输还是在临时表中进行大量工作,然后(最终)开始返回数据。在第二种情况下,除了重新编写查询,您无法做其他事情;但是,在第一种情况下,迭代器块通常会有所帮助,即
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;
         }
     }
}
现在,这是一个流式迭代器-您可以在其上“移1”,它将从传入的TDS数据中实时检索记录,而无需先缓冲所有数据。 如果您(也许明智地)不想编写自己的实现代码,则可以使用一些工具为您执行此操作-例如,LINQ-to-SQL \ 2可以轻松完成上述任务。
您需要使用数据分页。 SQL Server具有TOP子句(d中的SQL TOP 10 a,b,c)和BETWEEN:
SELECT TOP 10000 a,b,c from d BETWEEN X and Y
有了这个,我想您将能够检索N个行,进行一些部分处理,然后加载下N个行,依此类推。 这可以通过实现多线程解决方案来实现:一个将检索结果,而另一个将异步等待数据,它将进行一些处理。
如果您真的必须处理数百万条记录,为什么不每轮加载10,000条处理它们,然后再加载下10,000条呢?如果不考虑使用DBMS在加载数据之前对其进行过滤,因为数据库的性能要比逻辑上的要好得多。 或者遵循惰性加载概念,仅加载仅在需要时才将实际数据加载到的ID。

要回复问题请先登录注册