標籤:style blog http ar color os 使用 sp 資料
原文: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通過連結的伺服器遠程刪除資料效能問題解決