替代 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
- 创建临时文件table(最好有索引)
- 使用 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*/')
- 使用温度 table(s) 进行计算。
仍然需要至少 1 个链接服务器
当您的数据库不是 SQL 服务器(例如 Postgres、MySql、Oracle 等)时,OPENQUERY 具有更好的性能,因为查询是在链接上执行的服务器,而不是将所有数据拉到源服务器。
选项 2
您可以使用 ETL 工具,例如 SQL 服务器集成服务 (SSIS)
- 从 2 个服务器加载数据
- 使用 Slowly changing dimension or lookup 组件来确定差异。
- Insert/update你什么want/need
不需要链接服务器,SSIS可以直接连接数据库
我正在尝试构建一个程序来比较 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
- 创建临时文件table(最好有索引)
- 使用 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*/')
- 使用温度 table(s) 进行计算。
仍然需要至少 1 个链接服务器
当您的数据库不是 SQL 服务器(例如 Postgres、MySql、Oracle 等)时,OPENQUERY 具有更好的性能,因为查询是在链接上执行的服务器,而不是将所有数据拉到源服务器。
选项 2
您可以使用 ETL 工具,例如 SQL 服务器集成服务 (SSIS)
- 从 2 个服务器加载数据
- 使用 Slowly changing dimension or lookup 组件来确定差异。
- Insert/update你什么want/need
不需要链接服务器,SSIS可以直接连接数据库