>我在从源表到目标表中选择数据以找出源表中尚未完全集成到目标表的数据时遇到一些问题。
源表是另一个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
执行?非常感谢,任何想法和建议将不胜感激
您可能会遇到分布式查询的"N+1"。启发式方法在惩罚网络速度的方式上有些晦涩难懂。可以使用 SQL 事件探查器对此进行验证。
如果是这样,您可以通过以下方式修复:
- 创建一个本地临时表以容纳链接服务器远程表中的所有必需数据[并将任何不同的排序规则应用于临时表列]
- 将远程数据插入本地临时表
- 将本地表与临时表联接。
如果TABLEA
明显小于[ORACLE_DB]..GOUP.TABLEA
,则可以从 oracle 创建一个引用 SqlServerTABLEA
的链接服务器,然后只查询视图或执行驻留在 oracle 中的存储过程,以允许在大部分数据而不是 SqlServer 上执行昂贵的筛选。