从不存在的源表到目标表的大量数据

Posted

技术标签:

【中文标题】从不存在的源表到目标表的大量数据【英文标题】:Huge amount of data from a source table where not exists to destination table 【发布时间】:2018-05-17 04:19:41 【问题描述】:

我在从源表选择数据到目标表以找出源表中的哪些数据尚未完全集成到目标表时遇到了一些问题。

源表是另一个 DBMS,在 SQL Server 中,我们使用链接服务器来访问源表的 DBMS,并且集成几乎只是直接从源的列到目标的列(没有其他计算)

当我执行这样的选择语句时

SELECT A.*  
FROM [ORCLE_DB]..GROUP.TABLEA AS A 
WHERE NOT EXISTS (SELECT 1 FROM TABLEA as B WHERE A.ID = B.ID)

选数据要花很长时间,而且数据量非常大,大约有2000万行数据。

是否有任何其他方法可以选择这些行,可以让SELECT 执行更高效、更快?非常感谢您,任何想法和建议将不胜感激

【问题讨论】:

【参考方案1】:

您可能会遇到“N+1”的分布式查询。启发式方法在惩罚网络速度的方式上有些神秘。您可以使用 SQL Profiler 验证这一点。

如果是这样,您可以通过以下方式修复:

    创建一个本地临时表以容纳来自链接服务器远程表的所有必需数据 [并对临时表列应用任何不同的排序规则] 将远程数据插入到本地临时表中 将本地表与临时表连接起来。

【讨论】:

【参考方案2】:

如果TABLEA 明显小于[ORACLE_DB]..GOUP.TABLEA,您可以从oracle 创建一个引用您的SqlServer TABLEA 的链接服务器,然后只查询视图或执行驻留在oracle 中的存储过程,以允许昂贵的过滤在那里执行大量数据而不是在 SqlServer 上。

【讨论】:

以上是关于从不存在的源表到目标表的大量数据的主要内容,如果未能解决你的问题,请参考以下文章

将数据从源配置单元表的多列复制到目标配置单元表的不同行的单列

动态SQL从表中执行大量行

为源表的一行中的每一列插入目标表的新条目

大量数据快速插入方法探究[nologging+parallel+append]

SQL 代码SQL复制数据表及表结构

从 AWS Glue 表到 RedShift Spectrum 外部表的日期字段转换