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跟踪到的语句如下:

     

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

  • 相关阅读:
    寒假学习进度七
    寒假学习进度六
    寒假学习进度五
    mysql 数据库第一天
    HTML 标签&总结
    事件对象
    js的事件流的概念
    jquery 的位置信息
    小米导航 案例
    jquery 的文档操作
  • 原文地址:https://www.cnblogs.com/JentleWang/p/3643408.html
Copyright © 2011-2022 走看看