2014-01-24 62 views
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) 

我这样做,但表现得非常可怕。

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

回答

1

为了提高链接服务器的性能,请使用openquery。否则,首先从远程服务器返回所有数据,然后应用where子句。

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

+0

我大多同意使用OPENQUERY的情绪,但这不像黑白声音。使用分布式查询(linkedserver.database.schema.table)**可以**首先返回所有数据,并在tempdb中创建一个副本(如果它认为合适),然后应用过滤器。这个答案听起来像它会一直这样做。 – GarethD

+0

此外,分布式查询可以利用链接服务器上的统计信息,所以如果where子句意味着不会返回许多行,它将不会创建完整副本,并且会相应地调整任何进一步的交互(例如,可能会认为嵌套循环连接比散列匹配更有效,因为只有50行)。 OPENQUERY不能执行此操作,并且(AFAIK)始终假定将返回10,000行。这可能导致使用效率较低的连接回到其他数据。 – GarethD

0

是的。性能会很糟糕。这取决于您和其他公司之间的网络,以及必须在途中完成的任何认证和授权。

这就是为什么链接服务器没有被使用太多,即使是在一家公司内:性能通常很差。 (我从来没有在一家独立的公司看到链接服务器,并且只能同情!)

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

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

最便宜的替代方案是:将数据本地缓存:具有后台服务正在运行,将最新版本的数据拖出链接服务器表在本地数据库中设置一个表,然后针对本地表运行查询。这取决于远程数据的可变性以及查询必须是最新的。外汇方面,如果您正在执行获取昨天的销售数据等事情,那么您可能可以通宵通宵拉动。如果你需要更多的最新数据,也许每小时拉一次。你有时会变得相当挑剔,如果数据结构支持,它只会提取自上次拉动以来发生变化的数据:这使得每次拉动都变得更小,并允许更频繁的拉动,也许......

更昂贵的涉及工作你和另一家公司:就是重新设计它,以便其他公司通过你公开的WCF服务(或者其他)推动你的变化。然后这可以在数据进入时更新您的本地副本。

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;