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

Sql 从远程服务器检索数十亿行?,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我正在尝试从远程SQL Server检索大约2000亿行。为了优化这一点,我将查询限制为仅使用索引列作为筛选器,并仅选择列的子集,以使查询如下所示: SELECT ColA, ColB, ColC FROM <Database> WHERE RecordDate BETWEEN '' AND '' 从RecordDate位于“”和“”之间的位置选择ColA、ColB、ColC 但看起来,除非我将查询限制在几个小时的时间窗口内,否则查询在所有情况下都会失败,并出现以下错误: OLE

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

SELECT ColA, ColB, ColC FROM <Database> WHERE RecordDate BETWEEN '' AND ''
从RecordDate位于“”和“”之间的位置选择ColA、ColB、ColC
但看起来,除非我将查询限制在几个小时的时间窗口内,否则查询在所有情况下都会失败,并出现以下错误:

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 "<>". 
链接服务器“”的OLE DB提供程序“SQLNCLI10”返回消息“查询超时已过期”。
Msg 7399,级别16,状态1,服务器M为什么一次读取2000亿行

你应该翻页阅读,比如说一次读几千行

即使你真的需要阅读所有的2000亿行,你仍然应该考虑使用分页来把阅读分解成更短的查询——这样,如果发生了故障,你只需继续阅读你所遗漏的地方。

请参阅,以了解使用
行数

如果您正在进行数据分析,那么我怀疑您使用了错误的存储(SQL Server并不是专门为处理大型数据集而设计的),或者您需要更改查询,以便使用SQL在服务器上进行分析

更新:我认为最后一段有点被误解了

SQL Server中的存储主要是为在大规模并发环境中高效查询海量数据集而设计的(例如,读取/更新数十亿数据库中的单个客户记录,同时数千其他用户也在对其他记录执行相同的操作)。通常,目标是最大限度地减少数据读取量,减少所需的IO量,同时减少争用

您所说的分析几乎与此完全相反-一个单一的客户积极地尝试读取几乎所有的记录,以便执行一些统计分析

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


如果您认真对待海量数据集的处理/分析,那么有一些存储格式正是针对这类事情进行了优化的—SQL Server还提供了一个名为的附加服务,该附加服务添加了附加功能和数据挖掘功能,使用更适合这种处理的存储模式。

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


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

就我个人而言,如果我试图一次提取那么多数据,我会先使用数据提取工具(如BCP)将数据提取到本地文件,然后再尝试对其进行操作


这是一种更适合的工作。即使是ReadFromOleDbSource->WriteToOleDbSource这样的简单流程也可以处理此问题,为您创建必要的批处理。

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

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


看看这个。连接下有一个远程查询超时设置,默认设置为600秒,您需要将其更改为零(无限制)或其他您认为正确的值。

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

为此,请转到SSMS,连接到服务器,在对象资源管理器中右键单击服务器名称,进一步选择
属性->连接
,并更改
远程查询超时(秒,0=无超时)
文本框中的值


+1,我认为这是一个更合适的答案,因为尝试将
行数
超过2000亿行将是一件非常困难的事情,因为SQL Server什么时候不是为大型数据集设计的?我在SQL Server中管理了数十亿行,没有遇到任何在其他RDBMS系统中不会遇到的挑战。@Aaron--SQL Server,尤其是企业版附带的附加组件,是进行此类分析的极好平台。@James我想我们是一致的。Kragen建议SQL Server不是为这么多数据而设计的。一定是想到了古代版本。@Kragen,SQL Server可以很好地处理数十亿行,而且它已经能够处理很长时间了。回到SQL2000(当时是2003年),我在一个表中管理了数十亿行。SQL Server 6.5可能在这么大的数据负载方面遇到了问题,但那是很久以前的事了。@Kragen--我想我们真的同意了--是分析服务附加组件让它变得非常棒!由于他只有对服务器的ODBC访问权限,很难看出他除了“选择”之外还能使用任何东西。在支持服务器端游标的RDBMS中,服务器端游标是连接的一个属性,并且完全独立于