SQL Server连接服务器性能

17

我正在使用 SQL Server 2008 Enterprise,同时使用联接服务器技术从另一台服务器上的 SQL Server 2008 Enterprise 实例连接。我编写 TSQL 来操作来自两个服务器实例的对象(如表)。

我的问题是,对于联接服务器,是否存在性能问题?如果是,主要性能瓶颈是什么,我们应遵循哪些最佳实践?

谢谢, George

6个回答

17
我的问题是,对于联接服务器,是否存在性能问题?如果有,最关键的性能瓶颈是什么,我们应该遵循哪些最佳实践?
与什么相比?对于什么样的查询?当然,这完全取决于你在做什么。对于某些查询,性能损失将微不足道,而对于其他查询,则巨大。
你应该记住一堆问题:
- 如果你将从DB1连接2个表到DB2中的2个表,并且这些表非常大,则可能会出现问题。最终,查询将在某个地方执行。数据库必须将所有结果拉到主数据库中,并在主数据库上维护事务完整性。这可能非常昂贵。 - 如果你开始运行分布式事务可以变得复杂,非常快。 - 当跨服务器加入数据时,远程服务器上的索引可能会变得无用。所有数据都必须移动到某个地方进行连接。 - 联接服务器链接可能会在意想不到的时间停止,并导致难以诊断的错误。
过去,我发现在加入之前将远程数据移到本地并对其进行索引可以快几个数量级。

  1. "数据库将不得不将所有结果拉入主数据库,并在主数据库上维护事务完整性" -- 我认为SQL Server应该为两个服务器维护数据完整性,为什么你只提到主数据库服务器呢?
  2. 如果我只是从/向远程链接的数据库服务器执行一些查询/插入操作,我能否这样简单地理解--本地对象和链接服务器上的对象之间唯一的区别是,我们需要网络通信而不是访问本地内存来访问对象,对于其他事情,几乎相同?
- George2
1
正如海报所暗示的那样,链接服务器只能传输数据,而不能传输索引。基本上,如果您正在将本地表与远程服务器上的表连接,那么就好像远程服务器上的索引不存在一样。根据您的查询,这可能会导致性能下降,超过所有其他考虑因素。 - Nimrand

5

这取决于你所做的事情。

如果您正在运行在两个服务器实例之间加入表并传输大量数据的查询,则需要注意瓶颈。

如果服务器位于自己的子网中且具有1GB连接,则无需过多担心。如果两台服务器通过共享的慢速链接连接,则应予以关注。


谢谢Mitch,我可以这样理解吗?本地对象和链接服务器上的对象之间唯一的区别是,我们需要进行网络通信而不是访问本地内存来访问对象,对于其他事情,几乎相同? - George2
顺便问一下,Mitch大神,你对我在这里提出的问题有什么回答吗?:-)http://stackoverflow.com/questions/1248450/how-to-see-sql-server-cache-hit-rate我已经在你的回复评论中发布了我的最后一个问题。 - George2

2

我经常使用联接服务器来在不同环境之间同步数据,这是因为我发现它是编码和管理最简单的解决方案。

一个小建议,但可能不适用于其他人的情况,就是在拥有最多数据或正在做最多更新/插入操作的服务器上运行任何存储过程。例如,我有一个比较两个表并从A表向B表插入/更新的存储过程。如果我在A服务器上运行它,那么所需时间将比在B服务器上运行要长得多。如果你没有选择在哪里运行代码,并且你卡在了A服务器上,那么这个建议可能无法帮助你。

另一个建议是尽量减少返回的数据量。虽然在本地服务器上通常可以立即返回数据,但如果联接服务器距离较远,则延迟可能非常痛苦。在访问只需要的列时比平时更加严格。


2
您将需要在两个环节(从联接服务器到SQL Server再到您的计算机)中传输结果,这可能会稍微影响一下速度。其次,它需要解析名称和登录,这不会对速度造成太大的影响,但仍然会有一定影响。

总之,我发现唯一的主要瓶颈是跳过服务器,因为它必须传输信息两次。


谢谢Eric,1. 但是我对“在网络中传输结果两次”的原因感到困惑——为什么要传输两次?例如,如果我从链接服务器中选择一个表,我认为只需要将记录从链接服务器传输到我的服务器。所以只需要一次,而不是两次。2. “它必须解析名称并登录”——是每次与链接服务器通信还是只需要一次? - George2
1
@George:假设你没有在服务器上进行查询,那么你必须将结果从链接服务器传输到你的服务器(第一步!),然后再从你的服务器传输到机器上(第二步!)。无论如何,这都是一个额外的跳跃。至于连接,是的,它会保持,但有时候人们会有很多人访问链接服务器,这会导致性能下降。这就是为什么我提到它,但只是作为一个小问题。 - Eric
谢谢Eric,1. “to your server”--server指的是连接另一个数据库服务器的数据库服务器吗?“server to the machine”--machine指的是从数据库服务器调用服务的客户端吗?2. “As for the connection, yes, it does stick”--您能用其他词语表达一下吗?stick是什么意思?抱歉,英语不是我的母语。 :-) - George2
1
@George:1:你是正确的。2:持续,保持不变。会话对于每个用户都是相同的,这样他们只需要连接一次。 - Eric
谢谢Eric,如果我只是从/向远程链接的数据库服务器执行一些查询/插入操作,那么我能否这样简单地理解——本地对象和链接服务器上的对象之间唯一的区别是,我们需要进行网络通信而不是访问本地内存来访问对象,对于其他事情,几乎相同? - George2

1

我发现,如果你在进行外部连接(左/右)的时候性能会迅速下降。有时候,将数据从远程服务器选择到临时表中并建立索引,而不是通过网络进行连接,速度会更快。大多数情况下,最好的策略是按照逻辑编写查询语句,只有在性能真正成为问题时才进行调优。


0

@George2,

在这种情况下,Sam Saffron是正确的。当本地执行连接时,SQL Server使用索引执行连接,然后查找未包含在索引定义中的列。

使用链接服务器进行连接时,需要先传输所有表格从远程服务器,然后执行连接。这是一个瓶颈。如果您可以在将远程表格连接到本地表格之前对其进行预过滤(例如,使用良好的筛选器选择#temp表格以减少行数),则可以显着提高性能,然后如果您需要对该表格执行多个操作,则最好立即创建索引。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接