zoukankan      html  css  js  c++  java
  • 链接服务器使用OPENQUERY性能提升

    从哪找的记不清了,记录一下,使用OPNQUERY提升性能

    1. 问题

      系统有个模块,需要查询Oracle数据库中的数据。目前是通过建立链接服务器实现的。

      SQLServer访问Oracle实现 可参考这篇文章http://www.cnblogs.com/gnielee/archive/2010/09/07/access-oracle-from-sqlserver.html

      目前的查询语句就是一个简单的带where条件的查询语句,类似如下:

      

    SELECT * FROM LINKED_NAME..ACCOUNT_NAME.TABLE_NAME WHERE COLUMN1=SID;
    

      存在的问题是查询速度非常慢,前台报超时。所以准备提升下查询的性能

    1. 分析
        首先,确定远程Oracle的表在筛选字段上是否存在索引。经确认,存在索引。

      然后,在SSMS客户端中查看了执行语句的执行计划,如下:

      

      从执行计划可以看出,过程没有和自己设想的那样,原以为SQLServer会将整个查询提交到Oracle服务器执行。而实际在远程查询时,并没有加入where条件,而是将结果返回到本地后,在本地执行筛选(有一个筛选器)

      这样速度肯定会非常慢,因为查询没有使用到索引查找,需要将远程数据全部传输到本地后才执行筛选,相当于全表扫描,还多了网络传输的时间。

    1. 解决
        其实只要能将带where条件的查询语句一并提交到Oracle服务器执行远程查询,就可以解决性能问题了。

      但问题是OpenQuery不支持参数。见微软MSDNhttp://technet.microsoft.com/zh-cn/library/ms188427.aspx

      

      但好在我们可以另辟蹊径,通过拼接动态SQL的方式实现传递查询参数。

      OpenQuery使用参数可参考这篇文章:http://www.cnblogs.com/Dannier/archive/2011/09/21/openquery.html

      通过这种方式优化后,执行计划变为如下:可以看到实际返回的行数很少了

      

      查询速度提升明显,由原来的前台超时到现在的毫秒级。 ??

    SQL 在OPENQUERY中使用参数

    OpenQuery 是SQL Server用来与其他Server交互的一种技术,通过OpenQuery,SQL Server 可以直接访问其他数据库资源。而其他数据库在OpenQuery 表达式中是以Linked Server 存在的。 使用sp_linkedservers 可以找到当前数据库的所有linked server. OpenQuery的表达式可以这么写:
    
    Select * from OpenQuery([linkedServerName],'Select * from table1 where rownum < 10')而且值得注意的是,如果,你要在OpenQuery中执行如下的数据库语句,
    
    Select * from tbl_emp Where empName = 'leo''leo' 必须以单引号的形式传人,如下,
    
    Select * from OpenQuery([linkedServerName],'Select * from table1 where empName = ''leo''')
    
    DECLARE @Sql VARCHAR(1000)
    
    DECLARE @organizationID VARCHAR(10)
    
    SELECT @organizationID = (SELECT ORGANIZATION_ID FROM MYORGS WHERE ORGANIZATION_NAME = 'MMT')
    
    SET @Sql = 'SELECT * from tableName where organization_id ='+@organizationID
    
    SET @Sql = 'SELECT * FROM OPENQUERY(BETSYCRP2, ''' + REPLACE(@Sql, '''', '''''') + ''')'
    
    EXEC(@Sql)
    

    原文链接:https://blog.csdn.net/babymouse1212/article/details/71079102

  • 相关阅读:
    高性能TcpServer(Java)
    高性能TcpServer(C#)
    高性能TcpServer(C#)
    高性能TcpServer(C#)
    高性能TcpServer(C#)
    高性能TcpServer(C#)
    高性能TcpServer(C#)
    MySQL连表Update修改数据
    windows服务器安装安全狗时服务名如何填写
    织梦ckeditor编辑器 通过修改js去除img标签内的width和height样式
  • 原文地址:https://www.cnblogs.com/hong01072/p/15515603.html
Copyright © 2011-2022 走看看