• 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中的HashMap
    单机百万连接调优和Netty应用级别调优
    简单排序(冒泡排序,插入排序,选择排序)
    使用AC自动机解决文章匹配多个候选词问题
    树状数组解决数组单点更新后快速查询区间和的问题
    LeetCode 763. Partition Labels
    LeetCode 435. Non-overlapping Intervals
    线段树
    无序数组求第K大的数
    KMP算法解决字符串匹配问题
  • 原文地址:https://www.cnblogs.com/JentleWang/p/3643408.html
Copyright © 2020-2023  润新知