从远程服务器检索数十亿行?

时间:2011-07-28 21:55:46

标签: sql sql-server sql-server-2008

我试图从远程SQL Server检索大约2000亿行。为了优化这一点,我将查询限制为仅使用索引列作为过滤器,并且仅选择列的子集以使查询如下所示:

SELECT ColA, ColB, ColC FROM <Database> WHERE RecordDate BETWEEN '' AND ''

但看起来除非我将查询限制在几个小时的时间窗口,否则查询在所有情况下都会失败并出现以下错误:

OLE DB provider "SQLNCLI10" for linked server "<>" returned message "Query timeout expired".
Msg 7399, Level 16, State 1, Server M<, Line 1
The OLE DB provider "SQLNCLI10" for linked server "<>" reported an error. Execution terminated by the provider because a resource limit was reached.
Msg 7421, Level 16, State 2, Server <>, Line 1
Cannot fetch the rowset from OLE DB provider "SQLNCLI10" for linked server "<>". 

由于执行查询计划所需的时间,超时可能是个问题。因为我无法控制服务器,所以我想知道是否有一种很好的方法可以在我使用的简单SELECT之外检索这些数据。我可以使用任何特定于SQL Server的技巧吗?也许告诉远程服务器对数据进行分页而不是发出多个查询或其他什么?关于如何改进这个的任何建议?

7 个答案:

答案 0 :(得分:13)

这更像是SSIS适合的工作。即使像ReadFromOleDbSource-&gt; WriteToOleDbSource这样的简单流程也会处理这个问题,为您创建必要的批处理。

答案 1 :(得分:5)

为什么一次读取200亿行?

你应该把它们分页,一次读几千行。

即使你真的需要读取所有200亿行,你仍然应该考虑使用分页来将读取分解为更短的查询 - 这样如果发生故障,你只需继续阅读你离开的地方。

有关使用ROW_NUMBER

实施分页的至少一种方法,请参阅efficient way to implement paging

如果您正在进行数据分析,那么我怀疑您使用的是错误的存储(SQL Server并非真正用于处理大型数据集),或者您需要更改查询以便在服务器使用SQL。

更新:我认为最后一段有点曲解。

SQL Server中的存储主要是为online transaction processing (OLTP)设计的 - 在大规模并发环境中高效查询海量数据集(例如,在数十亿的数据库中读取/更新单个客户记录,同时还有成千上万的其他数据库用户对其他记录做同样的事情)。通常,目标是最大限度地减少读取数据的数量,减少所需的IO数量,同时减少争用。

您正在谈论的分析几乎与此完全相反 - 单个客户主动尝试阅读几乎所有记录以执行某些统计分析。

是的SQL Server将对此进行管理,但您必须记住,它针对完全不同的场景进行了优化。例如,尽管您的统计处理可能仅基于2列或3列,但一次从磁盘读取数据(8 KB)。根据行密度和列宽,您可能只使用存储在8 KB页面上的一小部分数据 - 大多数SQL Server必须读取和分配内存的数据甚至都没有使用。 (请记住,SQL Server也必须锁定该页面,以防止其他用户在读取数据时弄乱它。)

如果您认真对待大量数据集的处理/分析,那么存在针对此类事情进行优化的存储格式 - SQL Server还有一个名为Microsoft Analysis Services的附加服务,可以添加额外的online analytical processing (OLAP)和数据挖掘功能,使用更适合这种处理的存储模式。

答案 2 :(得分:3)

我个人会使用BCP之类的数据提取工具将数据传入本地文件,然后再尝试操作它,如果我试图同时提取那么多数据的话。

http://msdn.microsoft.com/en-us/library/ms162802.aspx

答案 3 :(得分:2)

这不是SQL Server特定的答案,但即使rDBMS支持服务器端游标,它也被认为是使用它们的不良形式。这样做意味着您正在消耗服务器上的资源,即使服务器仍在等待您请求更多数据。

相反,您应该重新构建查询用法,以便服务器可以尽快传输整个结果集,然后完全忘记您和您的查询,为下一个让路。当结果集太大而无法一次性处理时,您应该跟踪当前批处理返回的最后一行,以便您可以从该位置开始获取另一批处理。

答案 4 :(得分:1)

可能性是远程服务器设置了“远程查询超时”。查询失败需要多长时间?

答案 5 :(得分:1)

遇到同样的问题,运行查询后我也在10:01收到了消息。

检查link。在Connections下有一个远程查询超时设置,默认设置为600secs,您需要将其更改为零(无限制)或您认为正确的其他值。

答案 6 :(得分:0)

尝试更改远程服务器连接超时属性。

为此,请转到SSMS,连接到服务器,右键单击对象资源管理器中的服务器名称,再选择Properties -> Connections并更改Remote query timeout (in seconds, 0 = no timeout)文本框中的值。

enter image description here

相关问题