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

Leg*_*end 7 sql sql-server sql-server-2008

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

SELECT ColA, ColB, ColC FROM <Database> WHERE RecordDate BETWEEN '' AND ''
Run Code Online (Sandbox Code Playgroud)

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

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 "<>". 
Run Code Online (Sandbox Code Playgroud)

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

Rem*_*anu 13

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

  • +1,我相信这是一个更合适的答案,因为试图做一个超过2000亿行的"ROW_NUMBER"将是一件非常困难的事情. (2认同)

Jus*_*tin 5

为什么一次读取200亿行?

你应该对它们进行分页,一次读几千行.

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

来实现分页高效的方式使用实现分页的至少一个方法ROW_NUMBER

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

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

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

你所谈论的分析几乎是这样做的正好相反-一个单一的客户端主动尝试读取几乎所有以执行一些统计分析记录.

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

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

  • @Kragen,SQL Server可以很好地处理数十亿行,现在已经能够这么做了.回到SQL 2000(当时是2003年),我在一张表中管理了数十亿行.SQL Server 6.5可能存在这么多数据负载的问题,但这是很久以前的事了. (3认同)
  • 从什么时候开始SQL Server不是为大型数据集设计的?我已经在SQL Server中管理了数十亿行,并且没有遇到任何我在其他RDBMS系统中不会遇到的挑战. (2认同)