【问题标题】:Selecting into a Table from a Join with Large Amounts of Data从包含大量数据的联接中选择表
【发布时间】:2020-10-28 23:53:42
【问题描述】:

我正在尝试使用按日期范围过滤的结果连接两个表,然后将创建的连接选择到一个新表中。有两张表:一张是大约 50 万条记录,另一张是大约 1.5 亿条记录。我试图运行代码以使用内部连接进行提取。这通常会一直运行,直到我收到一个我已用完所有磁盘空间的错误。我不确定问题是否在于巨大表本身的连接,或者我正在尝试将结果写入新表。另外值得注意的是,大表作为视图位于链接服务器上。

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')

【问题讨论】:

    标签: sql sql-server inner-join


    【解决方案1】:

    您正在跨服务器的事务中进行分布式联接。您非常希望该连接在一台服务器上的内存中运行。网络比 RAM 慢很多。

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

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

    如果这是在大表所在的位置执行的,我会将较小的表加载到本地临时表中。然后我会使用本地事务来进行加入。你可以试着用大桌子来做这件事。您需要为 1.5 亿条记录留出空间。它可能会运行得更快。

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

    对于一个进程,我确实创建了一个值的 xml 文档以传递给远程服务器。远程服务器加入 xml(节点的东西)以获取所需的数据,而无需分布式连接。

    【讨论】:

    • 感谢您的回答,我很感激。我认为问题在于这是跨服务器的。我真的只需要使用连接,因为我需要按本地表中的日期列过滤链接表。这些表通过它们的 ID 对应,所以我想我需要这些。知道如何在链接服务器中创建临时表。这是商业用途,所以我不确定安全性是否会妨碍您。再次感谢。
    • OPENQUERY 执行一个批处理。您可以使用 ”;”分隔语句或执行过程。这可能很麻烦。尝试sommarskog.se/share_data.html#OPENQUERY 了解更多信息。 (Erland 是我最喜欢的 SQL 作者。他对 T-SQL 的分析非常详细。)阅读本文的其余部分以获得想法。它用于在过程之间传递数据,但似乎相关。还有sommarskog.se/arrays-in-sql.html(短)和sommarskog.se/arrays-in-sql-2005.html(长)重新传递数组
    • 也可以打包一个包含所有整数值的 varbinary 并将其作为参数传递给其他服务器。装箱:@packed = CAST(@int1 as binary(4)) + CAST(@int2 as binary(4)) 开箱:@int1 = CAST(SUBSTRING(@packed, 1, 4) as int) and @int2 = CAST(SUBSTRING(@packed, 5, 8) as int)
    猜你喜欢
    • 1970-01-01
    • 2015-06-30
    • 2012-02-11
    • 1970-01-01
    • 2021-12-24
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多