2010-05-26 25 views
4

我有一个导入2个链接的服务器之间。我基本上需要将来自多重连接的数据放入我的表格中。性能的数据库间查询(链接的服务器之间)

当前查询是这样的:

select a.* 
from db1.dbo.tbl1 a 
     inner join db1.dbo.tbl2 on ... 
     inner join db1.dbo.tbl3 on ... 
     inner join db1.dbo.tbl4 on ... 
     inner join db2.dbo.myside on ... 

DB1 =链接服务器

DB2 =我自己的数据库

这个之后,我使用的是INSERT INTO +选择要添加这个数据在我的表中位于db2中。 (通常有几百条记录 - 这种导入每分钟运行一次)

我的问题与性能有关。链接服务器上的表(tbl1,tbl2,tbl3,tbl4)是巨大的表,其中包含数百万条记录,并且会减慢导入过程。 有人告诉我,如果我在存储过程中在“其他”一侧(db1 - 链接服务器)上执行连接,则即使查询看起来相同,也会运行得更快。是对的吗?这有点难以测试。请注意,连接也包含我的数据库中的表。

另外。有没有其他的“技巧”,我可以使用,以使其运行更快?谢谢

回答

1

在db1上放置一个存储过程以提高性能是正确的,这样少了数据必须通过管道,因为在连接中过滤了很多数据。

如果另一边的数据是静态的,为什么不把它放到物化视图中?这样你只需要每天更新一次数据,而不是每次执行查询。

1

存储过程被缓存,因此第一次运行存储过程需要一些时间。所有对该存储过程的进一步调用将会执行得更快。您可以通过将执行统计信息包含在SSMS中来查看性能影响。

要提高连接性能,请确保您有索引。

请注意,跨服务器插入是危险的,因为您依赖于网络。我也不确定你是否可以在这种情况下使用交易。如果不是,那是另一个问题。

我已经看到一个场景,临时数据库不能应付这样一个插入,并修复是使用游标。这是非常慢,但更可靠的情况。

2

这实际上取决于您的查询实际上在做什么。您可以使用连接上的“远程”提示来强制连接发生在链接服务器上。即:

select a.* 
from db1.dbo.tbl1 a 
     inner remote join db1.dbo.tbl2 on ... 
     inner remote join db1.dbo.tbl3 on ... 
     inner remote join db1.dbo.tbl4 on ... 
     inner join db2.dbo.myside on ... 

(我假设你离开的服务器从上面的,所有的引用都是真的“linkedserver.db1”“DB1。”)

如果你能做到大部分工作只需链接服务器上的信息,您就可以使用OPENQUERY来加快速度。即:

select a.* 
from OPENQUERY(db1, 'SELECT a.* from db1.dbo.tbl1 a 
     inner join db1.dbo.tbl2 on ... 
     inner join db1.dbo.tbl3 on ... 
     inner join db1.dbo.tbl4 on ... ') a 
     inner join db2.dbo.myside on ... 

但加快它可以在具有链接服务器控制哪些返回上一个控制表的最佳方式,但同样它取决于你的实际查询,它在做什么,什么权限你在链接的服务器上。

相关问题