我的一个客户有两个总部。每个 HO 都有近 300 个工作站,我的客户不想将所有信息复制到一个 HO 中,所以他问我是否可以将一些信息放入辅助表中,其中作业从 HO 2 到 HO 1 对于某些报告......这部分已经完成,我没有问题,但是当我不得不修改报告的存储过程时,真正的问题出现了。
在我有这样的代码之前:
SELECT D.IdDocument, D.etc...
FROM Document D (NOLOCK)
JOIN OtherTable OT (NOLOCK) on etc...
现在我已经这样尝试了:
1)第一次尝试:
SELECT DXD.IdDocument, DXD.etc...
FROM
(
SELECT D.*
FROM Document D (NOLOCK)
UNION ALL
SELECT D2.*
FROM RemoteDocument D2 (NOLOCK)
) DXD
JOIN OtherTable OT on etc...
2)第二次尝试:
CREATE TABLE #TempDocument
(
IdDocument INT,
IdLocation INT,
etc..
)
CREATE INDEX IDX_TMP_Document ON #TempDocument (IdDocument, IdLocation)
INSERT INTO #TempDocument
SELECT DXD.*
FROM
(
SELECT D.*
FROM Document D (NOLOCK)
UNION ALL
SELECT D2.*
FROM RemoteDocument D2 (NOLOCK)
) DXD
SELECT DXD.IdDocument, DXD.etc...
FROM #TempDocument DXD
JOIN OtherTable OT (NOLOCK) on etc...
问题是,在 sp 运行 5-10 分钟之前,现在是 30-40 分钟,检测到执行计划的主要问题是使用联合的联合/插入......
有人可以在使用之前告诉我一种更好/更快的方法来连接信息吗?
我建议您使用链接服务器。然后,一旦您创建了链接服务器。在其中一个系统上创建链接服务器的视图。
Server 1:
Linked Servers:
Server 2
Views:
MyNewView(Select * from openquery(linkedServer,'Select * from SomeDB.dbo.SomeTable')
这样做时。主服务器从视图中缓存数据。因此,您现在可以在一台服务器上工作,并且返回时间应该相当快,具体取决于您过滤和返回的数据量。
要设置链接服务器,请查看以下文章:此处。
这实际上并没有整合,但它希望可以改善一些速度问题,并允许您像在单个数据库中一样编写。清理代码并防止任何其他通信问题作为唯一的通信问题@链接服务器端。