Dynamic Parameters造成的linked server性能问题
来源:互联网 发布:武大网络空间安全学院 编辑:程序博客网 时间:2024/06/05 16:57
曾今遇到这样一个linked server的性能问题。
客户这边的linked server是从一台SQL Server 2000的服务器连接到一台后端的Oracle的数据库。客户遇到的问题是,他们将linked server运行在out of process模式下时,执行一句类似”select * from Oracleserver.databasename.schema.T where…”的查询来获取Oracle上的数据,但该查询花了很长时间都没运行结束。然而,再另一台SQL Server上建立linked server (运行在in process模式下)连接到同样的Oracle数据库,运行同样的语句,结果就能很快返回。
是什么原因造成了这样的性能差异呢?
客户通过跟踪Oracle的查询运行状况,发觉在有问题的Linked Server上,运行查询时会在Oracle那边对表T做一个全表扫描,然后把表T上所有的数据返回给SQL Server。然后在SQL Server那段对这些数据做过滤(也就是所有的where条件都是在SQL Server中被执行的)。不过在那套好的linked server上,所有的过滤操作是在Oracle端就执行完成的,然后Oracle端直接把过滤完的数据返回给SQL Server。在表T的数据量非常大的情况下,这两种不同的行为会造成返回到SQL Server端得数据量有巨大的差异。考虑到网络传输大数据的延迟和SQL Server需要调用大量IO来缓存接受到的数据,这种行为的差异会最终导致查询性能上的巨大区别。
客户一开始以为是out of process模式的问题,但是即使我们把有问题的linked server设置为in process模式下,问题依旧存在。
我们这里搭建了一个测试环境来模拟客户那里遇到的问题,并且查阅了相关的资料。我们发觉,当linked server使用四段式方式(Oracleserver.databasename.schema.T这样的形式)来访问后端Oracle数据库的时候,默认的行为就是把所有的数据传送给SQL Server然后在SQL Server端做过滤。也就是说,这事实上是MSDAROA(微软的Oracle驱动)的一个标准行为。
那么是什么原因使得另一套Linked Server会直接在Oracle端做过滤呢?
最终的研究表明这其实是受到一个叫”Dynamic Parameters”的MSDAROA设置的影响。当”Dynamic Parameters”被设置为1的时候,就会出现这种状况。
你可以到以下注册表项下面找到Dynamic Parameters的设置。
[HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/MSSQLServer/Providers/MSDAORA]
如果你找不到Dynamic Parameters这个值或者这个值为1,则数据就是在Oracle端先过滤然后返回。反之,如果Dynamic Parameters值为0(即disabled),则会把所有数据都返回到SQL Server端。
- Dynamic Parameters造成的linked server性能问题
- filter造成的性能问题
- clob加||隐式转换造成的性能问题
- Linked server的'NT AUTHORITY\ANONYMOUS LOGON' 问题
- 一个字节造成的巨大性能差异——SQL Server存储结构
- 一个字节造成的巨大性能差异——SQL Server存储结构
- 一个字节造成的巨大性能差异——SQL Server存储结构
- 一个字节造成的巨大性能差异——SQL Server存储结构
- SQL Server存储结构 一个字节造成的巨大性能差异
- 一个字节造成的巨大性能差异——SQL Server存储
- Sql server常见性能问题的总结
- SQL Server常见性能问题的优化
- Sql Server 模糊查询的性能问题
- SQL server 查询性能的问题
- sp_lock诊断Sql Server的性能问题
- dynamic-insert,dynamic-update能够性能上的少许提升
- 代码里直接返回对象造成的可读性、扩展性以及性能问题
- 为什么忘记 commit 也会造成 select 查询的性能问题
- how to debug EXC_BAD_ACCESS on iPhone
- 网站建设心得
- Jar命令 Manifest.mf的用法
- SAM的散列存储加密解密算法以及SYSKEY的计算
- Nios II 中alt_main 和main的区别
- Dynamic Parameters造成的linked server性能问题
- inux shell常用快捷键
- 以程序的方式操纵NTFS的文件权限
- ListView 实现更多按钮
- 使用UIAlertView和UITableView来创建一个有用的UIAlertTableView
- Linux中重定向及管道(ubuntu 终端命令)
- 从小做起
- 在DllMain中使用GetModuleFileName 获取进程名
- CORBA OmniORB 使用NameService时抛异常