zoukankan      html  css  js  c++  java
  • SQLServer通过链接服务器远程删除数据性能问题解决

    在上一遍文章中介绍了SQLServer通过链接服务器访问Oracle性能问题的解决方法,本文介绍链接服务器下远程删除SQLServer数据的性能问题解决

    1. 问题发现

    系统中有个功能,需要远程删除SQLServer实例的表数据,删除语句中有where条件,条件中有一个子查询。

    该功能前台执行速度非常慢。所以准备调优。

    下面为演示代码,未优化前如下:

    DELETE 
    FROM [LINKSERVERNAME].[AdventureWorks2008].[Sales].[SalesOrderDetail]
    WHERE SalesOrderDetailID=5
        AND EXISTS(SELECT TOP 1 1 FROM [LINKSERVERNAME].[AdventureWorks2008].[Sales].[SalesOrderDetail])

      此时的执行计划如下图:

    可以看到执行计划存在一个远程扫描,然后在本地执行筛选。

    在远程服务器开启profiler跟踪,部分内容如下图:

    可以看到远程服务器开启了一个游标,然后逐行读取数据并返回给调用端。

    可以预见性能会非常差,如何避免不带where条件的远程扫描呢?

    2. 问题解决

    2.1 OpenQuery

    使用OpenQuery将delete数据的筛选提交到远程服务器执行。

    DELETE 
    FROM OPENQUERY([LINKSERVERNAME]
        ,'SELECT * 
    FROM [AdventureWorks2008].[Sales].[SalesOrderDetail]
    WHERE SalesOrderDetailID=5
        AND EXISTS(SELECT TOP 1 1 FROM [AdventureWorks2008].[Sales].[SalesOrderDetail])'
    )

    此时,执行计划如图:

    2.2 sp_executesql

    将整个delete语句提交到远程执行

    DECLARE @sql nvarchar(max)
    SELECT @sql ='
    DELETE 
    FROM [AdventureWorks2008].[Sales].[SalesOrderDetail]
    WHERE SalesOrderDetailID=5
        AND EXISTS(SELECT TOP 1 1 FROM [AdventureWorks2008].[Sales].[SalesOrderDetail])
    '
    exec [LINKSERVERNAME].[AdventureWorks2008].dbo.sp_executesql @sql

    profiler跟踪到的语句如下:

     

    如有不对的地方,欢迎拍砖;如有其他方法,求分享,谢谢!

  • 相关阅读:
    java之元数据(metadata)
    悲观锁(Pessimistic Locking)和乐观锁
    新建了springboot项目在包下右键创建class时无class选项
    idea创建一个springboot项目
    处理百万级以上的数据提高查询速度的方法
    写入文件
    WCf客户端测试
    WCF客户端代理
    WCF之Windows宿主(可安装成服务自动并启动)
    戴上耳机,全世界都是你的
  • 原文地址:https://www.cnblogs.com/JentleWang/p/3643408.html
Copyright © 2011-2022 走看看