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

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

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

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

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

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

public IEnumerable 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(tsql, args)将执行上述操作 -自由。

您需要使用数据分页。

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行,依此类推。

这可以通过实现multithreading解决方案来实现:一个将检索结果,而另一个将异步等待数据,它将进行一些处理。

如果你真的必须处理数百万条记录为什么你不加载每轮10000处理它们然后加载下一万个? 如果不考虑使用DBMS在加载数据之前过滤数据,因为数据库上的性能比逻辑leyer好得多。

或者遵循延迟加载概念并仅加载仅在需要时加载实际数据的ID。