替代 SQL 服务器链接服务器

Alternate to SQL Server Linked Server

我正在尝试构建一个程序来比较 2 个具有确切 table 但在某些 table 中具有附加列的数据库服务器。我正在使用链接服务器连接这两个数据库服务器。

但是我发现了一个问题,当我尝试比较一些数据时,连接大多是超时的。当我检查 Activity 监控和执行计划时,超过 90% 是在远程查询中 - 这使得比较 1 个具有 5 个子条目 运行 的记录持续 5-7 分钟。

这是我尝试 运行 的示例查询。

Select 
    pol.PO_TXN_ID, pol.Pol_Num 
From 
    ServerA.InstanceA.dbo.POLine pol  
Where 
    not exist (Select 1 
               From ServerB.InstanceA.dbo.POLine pol2 
               where pol.PO_TXN_ID = pol2.PO_TXN_ID 
                 and pol.Pol_Num = pol2.Pol_Num)

我尝试使用 OPENROWSET,但我们的管理员不允许在生产服务器上安装它。

是否有任何替代方法可以用来优化我的查询而不是使用链接服务器?

选项:

  • OpenQuery() / 4 部分临时命名 tables.
  • ETL(例如:SQL 服务器集成服务)

链接服务器的问题,尤其是像您的示例中的 4 部分命名:

  • 查询引擎不知道如何优化它。他无法访问链接服务器上的统计信息
  • 导致进行全面 table 扫描,将所有数据提取到源 SQL 服务器,然后进行处理。 (高网络 IO,错误的执行计划,导致 运行 长查询)

选项 1

  1. 创建临时文件table(最好有索引)
  2. 使用 OPENQUERY 查询链接服务器,最好是过滤条件。例如:
CREATE TABLE #MyTempTable(Id INT NOT NULL PRIMARY KEY, /*Other columns*/)
INSERT INTO #MyTempTable(Id, , /*Other columns*/)
SELECT *
FROM OPENQUERY(ServerA, 'SELECT Id,  /*Other columns*/ FROM Table WHERE /*Condition*/')
  1. 使用温度 table(s) 进行计算。

仍然需要至少 1 个链接服务器

当您的数据库不是 SQL 服务器(例如 Postgres、MySql、Oracle 等)时,

OPENQUERY 具有更好的性能,因为查询是在链接上执行的服务器,而不是将所有数据拉到源服务器。

选项 2

您可以使用 ETL 工具,例如 SQL 服务器集成服务 (SSIS)

不需要链接服务器,SSIS可以直接连接数据库