Sql-Server-2016

如何通過 Remote Query showplan 運算符將動態 SQL 開放查詢儲存的 proc 呼叫插入到伺服器 A 上的臨時表中?

  • March 13, 2020

我必須通過動態 SQL 使用開放查詢從伺服器 A 呼叫伺服器 B 上的儲存過程,並將結果插入到伺服器 A 上創建的臨時表中。我在執行計劃中註意到,它使用遠端掃描顯示計劃運算符。我知道 Remote Query showplan 運算符何時可能更有效,但我不確定在這種情況下是否可能?(遠端儲存過程返回大約 150 萬行。)

這是我在本地伺服器 A 上的查詢:

CREATE TABLE #FinalResults (Field1 INT, Field2 VARCHAR(100))
DECLARE @DynamicSQL NVARCHAR(MAX) = ''

SELECT @DynamicSQL = @DynamicSQL + 
'
SELECT Field1, Field2
FROM OPENQUERY(MyRemoteServerB, ''EXEC sp_MyRemoteStoredProcedure'')
'

INSERT INTO #FinalResults
EXEC sp_ExecuteSQL @DynamicSQL;

這是我在遠端伺服器 B 上的遠端過程 sp_MyRemoteStoredProcedure 中的查詢:

CREATE TABLE #Results (Field1 INT, Field2 VARCHAR(100))

INSERT INTO #Results
SELECT Field1, Field2
FROM Database1.dbo.Table1
WHERE DateField >= 'Date1'
   AND DateField < 'Date2'

UNION

SELECT Field1, Field2
FROM Database2.dbo.Table1
WHERE DateField >= 'Date1'
   AND DateField < 'Date2'

SELECT Field1, Field2
FROM #Results

相關執行計划運算元: 執行計劃

我注意到在執行計劃中,它使用了 Remote Scan showplan 運算符。我知道 Remote Query showplan 運算符在可能的情況下會更有效…

遠端掃描操作員本身並沒有什麼低效的地方。例如,它與 一起使用BULK INSERT,這是非常有效的。遠端掃描的性能取決於它背後的東西,在這種情況下是連結伺服器、各種驅動程序、網路等。

遠端查詢運算符可以更有效,例如,如果可以將謂詞或聚合操作推送到遠端伺服器,而不是檢索所有行並在本地完成工作。

…但我不確定在這種情況下是否可能?

除了使用遠端掃描從 T-SQL 遠端儲存過程呼叫中讀取數據外,別無選擇。

引用自:https://dba.stackexchange.com/questions/261820