0

我有两台服务器。一个是我的,另一个是另一家公司的。在第二台服务器中,我无法创建任何数据库或添加任何函数或存储过程,但我需要返回信息以与我的数据库进行交叉连接。

例如,

select fieldA, fieldB from localTBL l
left join linkedserver.remoteDB.dboremoteTBL r on l.ID = r.ID

或者

select fieldA, fieldB from linkedserver.remoteDB.dboremoteTBL r
where r.ID in (select l.ID from localTBL l)

我这样做了,但表现非常糟糕。

是否有可能以更好的性能做到这一点?

4

3 回答 3

1

要获得链接服务器的更好性能,请使用 openquery。否则,您首先从远程服务器取回所有数据,然后再应用 where 子句。

在您的情况下,首先运行子查询并将值列表返回给变量。然后在您的 openquery 中使用该变量。

于 2014-01-24T13:02:17.163 回答
1

CTE 可用于仅通过网络传输您需要的信息,然后针对呼叫服务器执行连接。就像是:

DECLARE @Id As int;
SELECT @Id = 45;

with cte (ID, fieldB)
AS
(
    SELECT ID, fieldB
    FROM linkedserver.remoteDB.dboremoteTBL
    WHERE ID = @Id
)

SELECT lt.fieldA, cte.fieldB
FROM localTbl lt
    INNER JOIN cte ON lt.ID = cte.ID
ORDER BY lt.ID;
于 2015-02-14T19:03:05.447 回答
0

是的。性能将是可怕的。这取决于您和另一家公司之间的网络,以及必须在途中完成的任何身份验证和授权。

这就是为什么即使在一家公司内也很少使用链接服务器的原因:性能通常很差。(没见过独立公司有Linked Server,只能表示同情!)

除非您可以升级您之间的网络链接,否则您无法从链接服务器进行查询。

这种设置听起来像是对需要快速修复的问题的短期解决方案,并且持续时间比预期的要长。如果你能得到一个花钱的商业案例,有两种选择:

最便宜的选择:在本地缓存数据:运行后台服务,将最新版本的数据从链接服务器表中拖到本地数据库中的表中,然后对本地表运行查询。这确实取决于远程数据的可变性,以及您的查询必须是最新的。外汇,如果你正在做诸如获取昨天的销售数据之类的事情,你也许可以做一夜之间的拉动。如果您需要更多最新数据,也许每小时拉一次。有时你会变得很挑剔,如果数据结构支持它只提取自上次拉动以来发生变化的数据:这使得每个拉动变得更小并且允许更频繁的拉动,也许......

涉及您和另一家公司的工作更昂贵:是重新架构它,以便另一家公司通过您公开的 WCF 服务(或其他东西)将更改推送给您。然后,这可以在数据进入时更新您的本地副本。

于 2014-01-24T13:08:15.763 回答