[翻译]——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 Server使用链接服务器的5个性能杀手的更多相关文章
- SQL Server的链接服务器(MySQL、Oracle、Ms_sql、Access、SYBASE)
原文:SQL Server的链接服务器(MySQL.Oracle.Ms_sql.Access.SYBASE) 一.使用 Microsoft OLE DB Provider For ODBC 链接MyS ...
- SQL Server 远程链接服务器详细配置
原文:SQL Server 远程链接服务器详细配置[转载] http://hi.baidu.com/luxi0194/blog/item/a5c2a9128a705cc6c2fd7803.html - ...
- sql server 使用链接服务器连接Oracle,openquery查询数据
对接问题描述:不知道正式库oracle数据库账户密码,对方愿意在对方的客户端上输入账号和密码,但不告诉我们 解决方案:使用一台sql server作为中间服务器,可以通过转存数据到sql serv ...
- sql server 2005 链接服务器:未将服务器 配置为用于 RPC
原文:sql server 2005 链接服务器:未将服务器 配置为用于 RPC RPC: 远程过程调用(Remote Procedure Calls) --LinkedServer.Rpc 属性: ...
- sql server 2012 链接服务器不能链接sql server 2000的解决方案 ,
本数据源来自 https://www.kafan.cn/edu/922556.html 目的为了备忘 把原来的sql server 2005直接装成了2012,然后在建立链接服务器链接一台sql s ...
- SQL Server创建链接服务器
1.通过sql语句创建链接服务器,数据是sql server的 EXEC sp_addlinkedserver @server='test', --链接服务器别名,自定义 @srvproduct='' ...
- SQL Server 用链接服务器 同步MySQL
--测试环境SQL 2014 在MySql环境: use test ; Create Table Demo(ID int,Name varchar(50)) 在控制面板—管理工具—数据源(ODBC)— ...
- SQL Server 添加链接服务器
背景 在SQL SERVER中,如果我们查询数据库需要关联另外一台数据库中表,在这种情况下我们可以通过添加服务器链接来实现. 案列 方式1.sql server 提供了图形化界面,如下: 右键> ...
- SQL Server 创建链接服务器
遇到下列问题: 线上服务器A,中转服务器B,本地服务器C 数据在A上面,想在B上面操作类似 select * from [A].[database].table这样的SQL,不用去链接服务器,直接把处 ...
随机推荐
- Cookbook of QUnit
本篇文章是QUnit的简介,可以作为很好的入门教程.文章原址 介绍 自动化测试时软件开发过程中必不可少的一部分,而单元测试则是自动化测试的最为基本的一块,软件的每一个组件, 每一个功能单元都需要经过不 ...
- C#运用ThoughtWorks生成二维码
在现在的项目中,较多的使用到二维码,前面介绍过一篇使用Gma生成二维码的操作,现在介绍一个第三方组件,主要介绍生成二维码,二维码的解析,以及对二维码的相关信息的选择,现在介绍ThoughtWorks用 ...
- HTML基本元素(一)
HTML基本元素(一) 1.换行符 <br /> Ps:br 是换行(Break)的缩写,文本会在这个标签的地方换行. 实例: 第一行<br />第二行 2.段落 <p& ...
- jQuery-1.9.1源码分析系列(十) 事件系统——事件绑定
事件绑定的方式有很多种.使用了jQuery那么原来那种绑定方式(elem.click = function(){...})就不推荐了,原因? 最主要的一个原因是elem.click = fn这种方式只 ...
- JAVAWEB项目实现验证码中文、英文、数字组合
验证码基础 一.什么是验证码及它的作用 :验证码为全自动区分计算机和人类的图灵测试的缩写,是一种区分用户是计算机的公共全自动程序,这个问题可以由计算机生成并评判,但是必须只有人类才能解答.可以防止恶意 ...
- [工具] Firemonkey Style 调色工具(可另存 Style 文件)
版本:2016.12.21 (新增可取代颜色) 下载:[工具]OneStylePalette_调色工具_20161221.zip 版本:2016.12.09 (新增可导出全平台的 Style) 下载: ...
- JQuery的ajax
JQuery-AJAX: jQuery load() 方法是简单但强大的 AJAX 方法. $(selector).load(URL,data,callback);(这三个参数可以随意设置几个) @ ...
- Linux Ctrl+c与ctrl+z的区别
提问:CTRL-Z和CTRL-C区别?回答:CTRL-Z和CTRL-C都是中断命令,但是他们的作用却不一样.CTRL-C是强制中断程序的执行,而CTRL-Z的是将任务中断,但是此任务并没有结束,他仍然 ...
- 推荐一个内容滚动jquery插件
myslider是一个内容滚动jquery插件,版本0.1.2的每次滚动内容是一行内容,可以是文字,可以是一个链接,还可以是图片. 官方网址:http://keleyi.com/jq/myslider ...
- js 模块化的一些理解和es6模块化学习
模块化 1 IIFE 2 commonjs 3 浏览器中js的模块化 4 简单理解模块加载器的原理 5 es6 之前在参加百度前端技术学院做的小题目的时候,自己写模块的时候 都是写成立即调用表达式( ...