Sql-Server

哪個更有效:從連結伺服器中選擇或插入連結伺服器?

  • July 13, 2013

假設我必須將數據從一台伺服器導出到另一台伺服器(通過連結伺服器)。哪種說法會更有效率?

在源伺服器中執行:

INSERT INTO [DestinationLinkedServer].[DestinationDB].[dbo].[Table]
SELECT a, b, c, ... FROM [dbo].Udf_GetExportData()

或在目標伺服器中執行:

INSERT INTO [dbo].[Table]
SELECT a, b, c, ...
FROM OPENQUERY([OriginLinkedServer],
   'SELECT a, b, c, ... FROM [OriginDB].[dbo].Udf_GetExportData()')

哪一個會更快並且總共消耗更少的資源(源伺服器和目標伺服器)?兩台伺服器都是 SQL Server 2005。

假設我必須將數據從一台伺服器導出到另一台伺服器。

最好是使用

  • 如果您希望所有數據使用備份/恢復;BCP 輸出和 BCP 輸入或 SSIS
  • 如果您想要數據子集(僅限某些表),請使用 SSIS 或 BCP OUT & BCP IN

要移動數據,取決於數據的數量/大小和 n/w 頻寬,連結伺服器會降低性能。

在源伺服器中執行或在目標伺服器中執行 - 哪一個會更快並且總共消耗更少的資源(源伺服器和目標伺服器)?

– 在源伺服器中執行:

INSERT INTO [DestinationLinkedServer].[DestinationDB].[dbo].[Table]
SELECT a, b, c, ... FROM [dbo].Udf_GetExportData()

當您在源伺服器上執行查詢並將數據推送到目標伺服器時,這稱為推送數據。這將是昂貴的操作。

— 在目標伺服器中執行

INSERT INTO [dbo].[Table]
SELECT a, b, c, ...
FROM OPENQUERY([OriginLinkedServer],
   'SELECT a, b, c, ... FROM [OriginDB].[dbo].Udf_GetExportData()')

當您在目標伺服器上執行查詢並從源伺服器中提取數據時,這稱為拉數據。與前一種相比,這將更快且資源消耗更少(取決於提取的數據量)。

在 pull 方法的情況下,使用 SQL Profiler,您將看到跨連結伺服器(源伺服器)執行單個 SQL 語句,並將結果集從源伺服器拉到目標伺服器,這比 PUSH 有巨大的性能提升方法。

另一點需要注意的是:

在連結伺服器(使用 servername.databasename.schema.tablename aka 分佈式查詢的 4 部分命名約定)和 OPENQUERY 之間,通常 OPENQUERY 會很快。為什麼 ?

對於連結伺服器- 查詢優化器通過查看查詢命名法來創建執行計劃,並將其分解為遠端和本地查詢。本地查詢在本地執行,遠端查詢的數據從遠端伺服器收集、在本地清理、組合在一起並作為單個記錄集呈現給最終使用者。

對於 OPENQUERY - 在指定的連結伺服器上執行指定的傳遞查詢。SQL Server 將傳遞查詢作為未解釋的查詢字元串發送到 OLE DB 數據源。因此,SQL 不會對查詢應用任何類型的邏輯,也不會嘗試估計該查詢會做什麼,它只會將指定的查詢按原樣傳遞給目標連結伺服器。當您不在一個查詢中引用多個伺服器時,打開查詢很有用。它通常很快,因為 SQL 不會將其分解為多個操作,並且不會對收到的輸出執行任何本地操作。

優秀的閱讀參考:

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