[翻译]——SQL Server使用链接服务器的5个性能杀手

简介: 原文:[翻译]——SQL Server使用链接服务器的5个性能杀手 前言: 本文是对博客http://www.dbnewsfeed.com/2012/09/08/5-performance-killers-when-working-with-linked-servers/的翻译, 如有翻译不对或不好的地方,敬请指出,大家一起学习进步。
原文: [翻译]——SQL Server使用链接服务器的5个性能杀手

 前言: 本文是对博客http://www.dbnewsfeed.com/2012/09/08/5-performance-killers-when-working-with-linked-servers/的翻译, 如有翻译不对或不好的地方,敬请指出,大家一起学习进步。尊重原创和翻译劳动成果,转载时请注明出处。谢谢!

 

当使用链接服务器(Linked Servers)时,最昂贵的代价就是网络带宽间大量数据的传输。在正确的服务器书写正确的代码是非常重要的,因为每一个错误都会导致在网络带宽上付出非常昂贵的代价。 下面是使用链接服务器(Linked Servers)时的几个常见错误:

1:使用推送方式而不是拉方式取数

   出人意料之外的是,使用链接服务器推送数据比拉取数据慢得多。Linchi Shea写了一篇很好的博客讨论这个。

   Linchi Shea 使用openquery来说明两者间的差异,但是这个也会发生在使用链接服务器的SQL语句中(这里不好翻译,其实就是查询中使用Linked Server需要用到 LinkServer.DatabaseName.dbo.TableName)

2: 使用JOIN

    跨服务器查询时,为了在两台服务器之间的数据集之间执行JOIN操作,SQL Server需要将数据从一台服务器传送到另外一台服务器。如果传送的数据是一个非常大的表,这个过程可能会非常痛苦。通常来说,数据会从远程服务器传送到本地服务器。为了防止大量数据在服务器之间大传送,你可以通过在查询条件中过滤数据,通过一个远程存储过程只取回相关数据来达到目的,万一你需要使用INNER JOIN关联两个不同服务器之间的数据集,而且本地表的数据量远小于远程服务器的那个表。你可以使用REMOTE JOIN HINT, 这样就会将数据从本地服务器将数据传送到远程服务器,从而提高性能

3:使用UNION

    正如JOIN操作,UNIION不同服务器之间的两个数据集必定导致从远程服务器传送数据到本地服务器。即使你执行远程查询合并(UNION)同一个远程服务器的两个数据集,还是会先将两个数据集传送到本地服务器,然后UNION两个数据集,可以通过远程存储过程,函数或视图先UNION数据库来阻止这个

4:书写太复杂的查询语句

  优化器不能总是能明白你需要做什么,尤其是你的SQL语句中使用了链接服务器(Linked Server)时,例如, 我遇到过一个类似如下SQL语句,执行了10分钟

   1: SELECT *
   2: FROM LocalTable
   3: WHERE SomeColumn <
   4: (SELECT COUNT(*)
   5:  FROM RemoteServer.SomeDB.dbo.SomeTable
   6:  WHERE SomeColumn > 100)

我像这样修改了查询语句

   1: DECLARE @Count INT
   2: SELECT @Count = COUNT(*)
   3: FROM RemoteServer.SomeDB.dbo.SomeTable
   4: WHERE SomeColumn > 100
   5:  
   6: SELECT *
   7: FROM LocalTable
   8: WHERE SomeColumn < @Count


这样重写SQL后,查询语句只跑了一秒就查询出结果了,保持SQL脚本简单。


5:当数据库位于同一个实例时使用链接服务器(Linked Server)
  

这种场景的性能损耗可能不像其它场景那样明显,但是这种方式比使用数据库前缀(Database.dbo.TableName)要慢

如果你想区别这两种情形,可以在测试数据库测试、对比这两种方法的性能,然后决定性能的提升是否值得在生产环境修改代码。在某些情况下,它是会提升性能的。

 

---------------------------------------自己的体会、理解----------------------------------------------

    关于SQL SERVER的链接服务器(Linked Servers)这项功能,跨数据库/跨服务器查询时非常有用(比如分布式数据库系统中),开发人员尤其喜欢使用它连接到远程数据源查询数据,甚至都到了滥用的地步。正所谓很多东西都具有两面性,链接服务器(Linked Servers)给跨服务器查询、分布式查询带来方便、简单化的同时,也带来了性能、安全等一系列问题。

1:性能问题

    在复杂环境下(大数据时代更是如此),可能需要在多个不同服务器之间的数据库进行数据交互。由于数据可以无处不在,开发人员自然要编写一个查询联接尽可能多的数据可以不考虑它是本地的还是远程的。于是链接服务器的大量使用应运而生,但是链接服务器的滥用和不合理使用可能会导致数据库出现很多ASYNC_NETWORK_IO等待事件。另外,书写不好的SQL有可能导致严重的性能问题。

  解决方法:你可以通过发布-订阅或者作业将数据集(表)数据先同步到本地服务器,然后将SQL脚本中的链接服务器去掉,这样对SQL查询性能有非常大的提升,尤其是查询比较频繁或数据量大的SQL语句。但是这样随之而来了其它问题: 同步数据的及时性(作业同步数据)、额外的精力去管理、监控数据同步(发布-订阅)。

  SQL里面使用了Linked Servers导致性能低下,一方面是由于网络数据传送的延时,另外一方面则是优化器不能很好的生成最佳的执行计划. 解释:由于权限问题,使用了链接服务器(Linked Servers)的SQL导致SQL SERVER优化器不能利用远程服务器这些表的统计信息,从而不能生成最优的执行计划。如果SQL SERVER优化器可以利用到远程服务器相关表的统计信息,则链接服务器使用的账号必须拥有sysadmin、 db_owner, db_ddladmin这样的角色,但是很多时候处于安全考虑,创建链接服务器时使用的账号往往没有这么大的权限。在SQL SERVER 2012 SP1中这个问题已经解决了,只需要拥有SELECT权限就可以使用远程服务器相关表的统计信息。

 

下面这段摘自TOP 3 PERFORMANCE KILLERS FOR LINKED SERVER QUERIES

----------------------------------------------------------------------------------------------------------------

1. INSUFFICIENT PERMISSIONS

Without a doubt this is the number one reason for why linked server query performance suffers. Historically in order for SQL Server to take advantage of using statistics on the remote server then the login used to make the connection on the remote servers needed sufficient rights. The role needed would have been one of the following:

sysadmin db_owner db_ddladmin

If you don’t have sufficient permissions then you aren’t able to use stats, and this is killing your performance across that linked server connections. So for everyone that has been assigning the db_datareader role to remote logins you are sacrificing performance for security. While that may be an acceptable tradeoff in your shop, I am willing to wager that most admins have no idea about this silent performance killer.

A good example of identifying these symptoms are contained in this article: http://www.sql-server-performance.com/2006/api-server-cursors/

In SQL 2012 SP1 the permissions to view the statistics on an object have been modified so that a user with SELECT permission would be able to use the stats on the remote tables. Check this link for more details in the ‘Permissions’ section towards the bottom.

 

---------------------------------------------------------------------------------------------------

2:安全问题

    滥用链接服务器会导致一个数据库实例跟N个数据库实例之间建立Linked Server,导致数据库管理、监控的变得越来越复杂,管理问题是一个,另外一个则是数据库的安全问题。这个最是头痛。

 

参考资料:

http://www.dbnewsfeed.com/2012/09/08/5-performance-killers-when-working-with-linked-servers/

http://thomaslarock.com/2013/05/top-3-performance-killers-for-linked-server-queries/

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
14天前
|
存储 弹性计算 运维
阿里云服务器经济型e实例怎么样?性能如何?有用过的吗?
阿里云服务器经济型e实例怎么样?性能如何?有用过的吗?阿里云服务器ECS推出经济型e系列,经济型e实例是阿里云面向个人开发者、学生、小微企业,在中小型网站建设、开发测试、轻量级应用等场景推出的全新入门级云服务器,CPU采用Intel Xeon Platinum架构处理器
|
14天前
|
存储 弹性计算 运维
阿里云ECS云服务器经济型e实例99元价格便宜,性能如何?
阿里云ECS云服务器经济型e实例99元价格便宜,性能如何?阿里云服务器ECS推出经济型e系列,经济型e实例是阿里云面向个人开发者、学生、小微企业,在中小型网站建设、开发测试、轻量级应用等场景推出的全新入门级云服务器,CPU采用Intel Xeon Platinum架构处理器
|
14天前
|
存储 弹性计算 运维
阿里云99元服务器ECS经济型e实例性能如何?详细介绍
阿里云99元服务器ECS经济型e实例性能如何?详细介绍,阿里云服务器ECS推出经济型e系列,经济型e实例是阿里云面向个人开发者、学生、小微企业,在中小型网站建设、开发测试、轻量级应用等场景推出的全新入门级云服务器,CPU采用Intel Xeon Platinum架构处理器
|
14天前
|
存储 弹性计算 运维
2024阿里云服务器经济型e实例规格云服务器性能介绍
2024阿里云服务器经济型e实例规格云服务器性能介绍,阿里云服务器ECS推出经济型e系列,经济型e实例是阿里云面向个人开发者、学生、小微企业,在中小型网站建设、开发测试、轻量级应用等场景推出的全新入门级云服务器,CPU采用Intel Xeon Platinum架构处理器
|
14小时前
|
存储 弹性计算 安全
阿里云8核64G云服务器多少钱?阿里云8核64G云服务器报价及性能测评
阿里云8核64G云服务器的价格因配置和促销活动而异。目前,内存型r5和内存型r6实例的8核64G配置云服务器有优惠,优惠后最低购买价格为1454.76元/3个月起。该配置支持购买3个月、6个月和1年,带宽为1~10M可选。此外,阿里云还提供了其他规格的8核64G云服务器,如内存型r7、AMD内存型r7a、高主频内存型hfr7、内存平衡增强型r6e、高主频内存型hfr6、AMD内存型r6a、安全增强内存型r7t、存储增强内存型r7se等。不同规格的云服务器CPU性能也不同,价格也有所差异。
12 2
|
1天前
|
机器学习/深度学习 存储 弹性计算
阿里云GPU服务器价格多少钱?2024年阿里云GPU服务器价格配置及性能测评
2024年阿里云GPU服务器是一款高性能的计算服务器,基于GPU应用的计算服务,多适用于视频解码、图形渲染、深度学习、科学计算等应用场景。阿里云GPU服务器具有超强的计算能力、网络性能出色、购买方式灵活、高性能实例存储等特点。 阿里云提供了多种配置的GPU服务器,包括gn6v、gn6i、vgn6i-vws和gn6e等,这些服务器配备了不同型号的GPU计算卡、不同规格的内存和存储空间,可以满足不同用户的计算需求。同时,阿里云还为新用户提供了特惠价格,包年购买更是低至3折起,使得用户可以更加经济地购买到高性能的GPU服务器。
19 0
|
1天前
|
存储 弹性计算 大数据
阿里云8核64G云服务器多少钱?2024年阿里云8核64G云服务器配置、价格、性能测评
2024年阿里云8核64G云服务器的价格为9934.16元一年。该价格基于特定的配置和促销活动,并可能因时间、活动政策、地域等因素而有所变动。关于阿里云8核64G云服务器的性能测评,该服务器配备了64GB的内存和8核的CPU,具有极高的计算能力和处理速度,适用于处理超大型数据、运行复杂应用或需要极高并发处理能力的场景。多种带宽选择(从1M到5M)可以满足不同的网络需求,确保数据传输的高效性。同时,40GB ESSD云盘提供了快速且稳定的数据存储解决方案,有助于提升整体性能。
|
1天前
|
存储 弹性计算 大数据
阿里云2核16G云服务器多少钱?2024年阿里云2核16G云服务器配置价格及性能详解
2024年阿里云2核16G云服务器的价格为2715.74元一年。这个价格基于特定的配置和促销活动,并且可能因时间、活动政策、地域等因素而有所变动。关于阿里云2核16G云服务器的性能测评,该服务器配备了16GB的内存和2核的CPU,虽然核数相对较少,但16GB的内存可以确保处理大型任务或应用时的流畅性。多种带宽选择(从1M到5M)可以满足不同的网络需求。40GB ESSD云盘提供了高速且稳定的存储性能,这对于提升数据读写效率非常重要。
10 0
|
1天前
|
存储 弹性计算 编解码
阿里云8核32G云服务器多少钱?2024年阿里云8核32G云服务器配置价格及性能评测
2024年阿里云8核32G云服务器的价格为7543.01元一年。该价格基于特定的配置和促销活动,可能因时间、活动政策、地域等因素而有所变动。关于阿里云8核32G云服务器的性能测评,该服务器配备了32GB的内存和8核的CPU,具有出色的计算能力和处理速度,可以轻松应对大型应用、高并发场景和复杂计算任务。同时,服务器提供了多种带宽选择,从1M到5M不等,可以满足不同用户的网络需求。40GB ESSD云盘提供了高速且稳定的存储性能,有助于提升数据读写效率。
|
1天前
|
存储 弹性计算 大数据
阿里云4核16G云服务器多少钱?2024年阿里云4核16G云服务器配置价格及性能测评
阿里云4核16G云服务器多少钱?2024年阿里云4核16G云服务器的价格并不是固定的,它会根据促销活动和实例类型有所变动。例如,在阿里云公布的2023年新版收费标准及活动价格中,4核16G配置的活动价格根据实例类型有所不同,共享型s6实例的价格为107.46元3个月,年付为1719.36元/年。此外,还有一款轻量应用服务器,4核16G的价格为61元一年。这些都是特定时间内的促销价格,可能会有所变化。关于阿里云4核16G云服务器的性能测评,这款服务器配备了16GB的内存和4核的CPU,能够提供较高的计算能力和处理速度,适合处理大型应用和复杂任务。同时,服务器提供了多种带宽选择,从1M到5M不等,

热门文章

最新文章