从具有大量数据的联接中选择 Table

Selecting into a Table from a Join with Large Amounts of Data

我正在尝试将两个 table 的结果按日期范围过滤,并将创建的 select 连接到一个新的 table。有两个table:一个是50万左右的记录,一个是1.5亿左右。我试图 运行 代码使用内部连接来提取。这通常是 运行 秒,直到我收到一条错误消息,提示我已用完所有光盘 space。我不确定问题是出在巨大的 table 本身的连接上,还是我正在尝试将结果写入新的 table。还要注意的是,大 table 作为视图位于链接服务器上。

SELECT
  * INTO New_Table
FROM
  OPENQUERY(
    [Linked_Server],
    'SELECT * FROM [LinkedDB].[Schema].[LinkedServerTable]'
  ) IL
  INNER JOIN [Schema].[OtherTableFromLocalHost] I ON IL.IdColumn = I.IdColumn
WHERE
  I.IDate >= CONVERT(DATE, '1/1/2020')
  AND I.IDate < CONVERT(DATE, '1/31/2020')

您正在跨服务器事务中执行分布式联接。您非常希望在一台服务器的内存中加入 运行。网络比 RAM 慢得多。

我记得因为这样的事情重启过服务器。进展是 - 尝试终止进程,尝试重新启动 dtc,尝试重新启动实例,尝试重新启动服务器。

  1. 您是否需要两个 table 中的所有列?
  2. 通常从 [Schema].[OtherTableFromLocalHost] 中选择多少条记录?

如果这是在大 table 所在的位置执行的,我会将较小的 table 加载到本地临时文件 table 中。然后我会使用本地事务来进行连接。您可以尝试使用大 table 执行此操作。 1.5 亿条记录需要 space。它可能会工作得更快。

是否有其他服务器上的链接服务器到此服务器?在远程查询中,您可以使用 WHERE 子句从 [Schema].[OtherTableFromLocalHost] 加载 IdColumn 到该服务器上的临时 table。然后在那里加入。然后将数据返回到临时 table。使用临时 table 执行任何需要的连接,然后插入到最终目的地。

对于一个进程,我确实创建了一个 xml 值文档以传递到远程服务器。远程服务器加入 xml(节点内容)以在没有分布式加入的情况下获取所需的数据。