我正在使用 SQL Server 2008 Enterprise,同时使用联接服务器技术从另一台服务器上的 SQL Server 2008 Enterprise 实例连接。我编写 TSQL 来操作来自两个服务器实例的对象(如表)。
我的问题是,对于联接服务器,是否存在性能问题?如果是,主要性能瓶颈是什么,我们应遵循哪些最佳实践?
谢谢, George
我正在使用 SQL Server 2008 Enterprise,同时使用联接服务器技术从另一台服务器上的 SQL Server 2008 Enterprise 实例连接。我编写 TSQL 来操作来自两个服务器实例的对象(如表)。
我的问题是,对于联接服务器,是否存在性能问题?如果是,主要性能瓶颈是什么,我们应遵循哪些最佳实践?
谢谢, George
这取决于你所做的事情。
如果您正在运行在两个服务器实例之间加入表并传输大量数据的查询,则需要注意瓶颈。
如果服务器位于自己的子网中且具有1GB连接,则无需过多担心。如果两台服务器通过共享的慢速链接连接,则应予以关注。
我经常使用联接服务器来在不同环境之间同步数据,这是因为我发现它是编码和管理最简单的解决方案。
一个小建议,但可能不适用于其他人的情况,就是在拥有最多数据或正在做最多更新/插入操作的服务器上运行任何存储过程。例如,我有一个比较两个表并从A表向B表插入/更新的存储过程。如果我在A服务器上运行它,那么所需时间将比在B服务器上运行要长得多。如果你没有选择在哪里运行代码,并且你卡在了A服务器上,那么这个建议可能无法帮助你。
另一个建议是尽量减少返回的数据量。虽然在本地服务器上通常可以立即返回数据,但如果联接服务器距离较远,则延迟可能非常痛苦。在访问只需要的列时比平时更加严格。
总之,我发现唯一的主要瓶颈是跳过服务器,因为它必须传输信息两次。
我发现,如果你在进行外部连接(左/右)的时候性能会迅速下降。有时候,将数据从远程服务器选择到临时表中并建立索引,而不是通过网络进行连接,速度会更快。大多数情况下,最好的策略是按照逻辑编写查询语句,只有在性能真正成为问题时才进行调优。
@George2,
在这种情况下,Sam Saffron是正确的。当本地执行连接时,SQL Server使用索引执行连接,然后查找未包含在索引定义中的列。
使用链接服务器进行连接时,需要先传输所有表格从远程服务器,然后执行连接。这是一个瓶颈。如果您可以在将远程表格连接到本地表格之前对其进行预过滤(例如,使用良好的筛选器选择#temp表格以减少行数),则可以显着提高性能,然后如果您需要对该表格执行多个操作,则最好立即创建索引。