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 + select 将此数据添加到位于 db2 中的表中。(通常几百条记录 - 此导入每分钟运行一次)

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

还。我可以使用其他“技巧”来加快运行速度吗?谢谢

4

3 回答 3

2

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

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 ... 

(我假设您将服务器排除在上述之外,并且所有“db1.”引用实际上都是“linkedserver.db1”。)

如果您可以仅使用链接服务器上的信息完成大部分工作,则可以使用 OPENQUERY 来加快速度。IE:

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 ... 

但是加快速度的最佳方法可能是在链接服务器上设置一个控制表来控制返回的内容,但这又取决于您的实际查询、它在做什么以及您在链接服务器上拥有的权限。

于 2010-05-28T03:35:27.417 回答
1

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

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

于 2010-05-26T09:36:13.130 回答
1

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

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

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

我见过临时数据库无法处理这种插入的情况,解决方法是使用游标。这要慢得多,但对于那种情况更可靠。

于 2010-05-26T09:36:45.877 回答