我在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 - 链接服务器)上进行连接,例如在存储过程中,那么即使查询看起来相同,它也会运行得更快。是对的吗?这有点难以测试。请注意,连接也包含我的数据库中的表。
另外。我可以使用其他“技巧”,以使这个运行更快?感谢
答案 0 :(得分: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 ...
(我假设您将服务器从上面移除,并且所有“db1。”引用都是“linkedserver.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 ...
但加快速度的最佳方法可能是在链接服务器上设置一个控制表来控制返回的内容,但这又取决于您的实际查询,它正在做什么以及您在链接服务器上拥有的权限
答案 1 :(得分:1)
将存储过程放在db1上以提高性能是正确的,这样就可以减少管道上的数据,因为在连接中过滤了很多数据。
如果另一侧的数据是静态的,为什么不将它放入物化视图?这样,您每天只需更新一次数据,而不是每次执行查询。
答案 2 :(得分:1)
存储过程被缓存,因此第一次运行存储过程时需要一些时间。对该存储过程的所有进一步调用将执行得更快。您可以通过在SSMS中包含执行统计信息来查看性能影响。
要提高连接性能,请确保已安装索引。
请注意,跨服务器插入是危险的,因为您依赖于网络。我也不确定你是否可以在这种情况下使用交易。如果不是,那就是另一个问题。
我见过一个场景,临时数据库无法处理这样的插入,修复就是使用游标。这种情况要慢得多,但在这种情况下更可靠。