首页 > 代码库 > SQLServer通过链接服务器远程删除数据性能问题解决
SQLServer通过链接服务器远程删除数据性能问题解决
原文: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跟踪到的语句如下:
如有不对的地方,欢迎拍砖;如有其他方法,求分享,谢谢!
SQLServer通过链接服务器远程删除数据性能问题解决
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。